起因:函数式编程的讨论,看到众多大佬讨论函数式编程的优劣。忽然想到自己最近看 axios 源码中的例子,在判断类型时用了柯里化的技巧。
const kindOf = (cache => thing => {
const str = toString.call(thing);
return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
})(Object.create(null));
const kindOfTest = (type) => {
type = type.toLowerCase();
return (thing) => kindOf(thing) === type
}
const isDate = kindOfTest('Date');
想请问大家,这样的技巧有什么 具体 的作用呢?
1
RecursiveG 2022-10-06 14:55:51 +08:00
说明需要多个参数的函数的功能也可以只用单个参数的函数实现,作证明的时候方便点。
写代码里基本用来缩减代码数量(也可能使代码更不可读)。 和其他程序员交流的时候当吹牛的资本。 |
2
ZE3kr 2022-10-06 15:17:22 +08:00 via iPhone
惰性求值可能有一点点用,当然没有 curry 的话也可以套一层 lambda 。总之我一直把多个参数的函数和 curry 当等价的用。curry 甚至还是 SML/NJ 编程语言的一个语法糖,写起来用起来都跟多个参数的函数没区别
|
3
ZE3kr 2022-10-06 15:18:59 +08:00 via iPhone
|
4
amlee 2022-10-06 15:28:26 +08:00
我自己的理解,柯里化是用来改变函数形状,可以方便的 compose/pipe
|
5
Znella OP @ZE3kr 谢谢,看完了。总结下来就是:通过削减函数参数的个数,能够让一些可以提前完成的函数得到执行(或者是一些准备工作)。这样看来还是有一些具体作用的。
|
6
Znella OP @RecursiveG 哈哈哈,第二点有异议,感觉似乎并不能缩减代码数量,不过不可读是真的不可读哈哈哈。
|
8
amlee 2022-10-06 16:11:18 +08:00 1
@Znella https://www.bilibili.com/video/BV1Nu411S7Jy/
这有函数式编程的课程,讲师是《你不知道 javascirpt 》作者。 我刷了一遍,挺有收获的。 有几节讲 arity, curry, pipe/compose |
10
YYYeung 2022-10-06 22:46:22 +08:00
函数层面的堆积木,不过结果是函数功能越来越单一化
|
11
aguesuka 2022-10-07 16:07:25 +08:00
纯函数语言里需要柯里化是因为 `foo(a, b)` 可以写成 `foo a b`, 注意语义不是等价的, 前者相当于 `foo (new-Pair(a, b))` 后者相当于 `foo (a) (b)`, 也就是在纯函数语言里, 我们可以用改变语义的代价, 少写括号和逗号. js 不能去括号, 所以不能享受这个优点.
不过 js 里可以把 `b => foo (a, b)` 写成 `foo (a)` 来精简代码, 然而在纯函数语言里一般提倡写成 `\b => foo a b`. |