请教 柯里化 的作用

2022-10-06 14:38:32 +08:00
 Znella

起因:函数式编程的讨论,看到众多大佬讨论函数式编程的优劣。忽然想到自己最近看 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');

想请问大家,这样的技巧有什么 具体 的作用呢?

1963 次点击
所在节点    问与答
11 条回复
RecursiveG
2022-10-06 14:55:51 +08:00
说明需要多个参数的函数的功能也可以只用单个参数的函数实现,作证明的时候方便点。
写代码里基本用来缩减代码数量(也可能使代码更不可读)。
和其他程序员交流的时候当吹牛的资本。
ZE3kr
2022-10-06 15:17:22 +08:00
惰性求值可能有一点点用,当然没有 curry 的话也可以套一层 lambda 。总之我一直把多个参数的函数和 curry 当等价的用。curry 甚至还是 SML/NJ 编程语言的一个语法糖,写起来用起来都跟多个参数的函数没区别
ZE3kr
2022-10-06 15:18:59 +08:00
amlee
2022-10-06 15:28:26 +08:00
我自己的理解,柯里化是用来改变函数形状,可以方便的 compose/pipe
Znella
2022-10-06 15:53:20 +08:00
@ZE3kr 谢谢,看完了。总结下来就是:通过削减函数参数的个数,能够让一些可以提前完成的函数得到执行(或者是一些准备工作)。这样看来还是有一些具体作用的。
Znella
2022-10-06 15:55:08 +08:00
@RecursiveG 哈哈哈,第二点有异议,感觉似乎并不能缩减代码数量,不过不可读是真的不可读哈哈哈。
Znella
2022-10-06 15:55:59 +08:00
@amlee 多参数的情况下为什么不能 pipe 呢?能给个例子吗?
amlee
2022-10-06 16:11:18 +08:00
@Znella https://www.bilibili.com/video/BV1Nu411S7Jy/

这有函数式编程的课程,讲师是《你不知道 javascirpt 》作者。
我刷了一遍,挺有收获的。
有几节讲 arity, curry, pipe/compose
Znella
2022-10-06 16:15:29 +08:00
@amlee 谢谢 ^ _ ^
YYYeung
2022-10-06 22:46:22 +08:00
函数层面的堆积木,不过结果是函数功能越来越单一化
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`.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884884

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX