欢迎!请参阅关于页面以了解更多有关此功能的信息。
今天我的脑海中闪过一个想法:自动柯里化在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]
我不知道这个问题的完整答案,但下面是一个链接,指向2008年10月Clojure Google组上的一个讨论,Rich Hickey就添加柯里化功能的方式回答了一个特定的建议。
https://groups.google.com/forum/#!searchin/clojure/currying$20hickey|sort:date/clojure/Nsd-7Iagkws/0sVdoJl7bFgJ
里奇当然知道柯里化,但对其重视程度我并不清楚。匿名函数和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