欢迎!请参阅 关于 页面以了解更多有关其工作方式的信息。
今天我脑中突然冒出了一个想法:自动柯里化是否曾在Clojure的设计或实现中被考虑过?
假设你有
(defn add [x y] (+ x y))
(map (add 2) [1 2 3 4 5])
如果Clojure自动柯里化,那将产生 [3 4 5 6 7],但当前由于参数数量不匹配而发生错误。在我看来,这种行为比错误更有生产力。所以我很好奇,如果曾经被考虑过,为何会故意避开这样的特性。
[3 4 5 6 7]
我不知道这个问题的完整答案,但下面是关于如何在Clojure中添加柯里化功能的讨论链接,Rich Hickey于2008年10月对某个特定建议作出了回应。
https://groups.google.com/forum/#!searchin/clojure/currying$20hickey|sort:date/clojure/Nsd-7Iagkws/0sVdoJl7bFgJ
Rich 很清楚柯里化是什么,至于它被认为有多重要,我就不知道了。匿名函数和 Clojure 的 #() 语法定义可以做一些柯里化无法做到的事情,可能只是需要多输入几个字符而已。我的消息中没有提及,在链接的讨论线程中也没有提到的设计权衡有很多,这并不奇怪。
#()
https://stackoverflow.com/questions/31373507/rich-hickeys-reason-for-not-auto-currying-clojure-functions
TL;DR:Clojure 被设计为要有可变参数函数,这与柯里化相冲突。
如果有柯里化,你也无法使用命名(关键字)参数。
关于 Rich Hickey 的另一个关于柯里化的旧讨论线程,以及一个可以进行部分应用的函数 appl(我猜“appl”这个名字有点像玩笑,因为它是“application”这个词的一部分):https://groups.google.com/forum/#!searchin/clojure/currying$20hickey|sort:date/clojure/TjvA5AQArUs/9bN78s4w-VkJ
appl
现在的 Clojure 核心中没有 appl 函数。我不知道它的历史,直到在通过旧 Google 群组消息进行关键字搜索时才得知。
如果你不介意使用外部库,Clojure 中可以实现柯里化
https://dragan.rocks/articles/18/Fluokitten-080-Fast-function-currying-in-Clojure