请在2024年Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解更多有关此功能的信息。

+1投票
语法和读取器

今天我的脑海中闪过一个想法:自动柯里化在Clojure的设计或实现过程中是否有过议论?

假设你有:

(defn add [x y] (+ x y))

(map (add 2) [1 2 3 4 5])

如果Clojure进行自动柯里化,那么结果将是[3 4 5 6 7],但目前正在出现错位参数错误。对我来说,我认为这种行为会比错误更有效。因此,我很想知道为什么会故意避开这种特性,即使它曾经被考虑过。

4 答案

+4投票

已选择
 
最佳答案

我不知道这个问题的完整答案,但下面是一个链接,指向2008年10月Clojure Google组上的一个讨论,Rich Hickey就添加柯里化功能的方式回答了一个特定的建议。

https://groups.google.com/forum/#!searchin/clojure/currying$20hickey|sort:date/clojure/Nsd-7Iagkws/0sVdoJl7bFgJ

里奇当然知道柯里化,但对其重视程度我并不清楚。匿名函数和Clojure的#()语法可以进行柯里化无法完成的事情,虽然可能需要更多一点字母键入,也许吧。如果我的消息中提到的并且未在相关讨论线程中提出的许多其他设计权衡并未考虑,我也不会感到惊讶。

+5

https://stackoverflow.com/questions/31373507/rich-hickeys-reason-for-not-auto-currying-clojure-functions

TL;DR:Clojure被设计为具有可变参数函数,而这与柯里化是相互排斥的。

如果有柯里化,你甚至无法使用命名(关键词)参数。

我刚刚了解到Clojure中的关键字参数
+3

另一个关于柯里化和Rich Hickey的讨论串,以及一个执行部分应用的函数appl(我猜这个“appl”名字是个玩笑,因为它只占“application”(应用)这个词的一部分):https://groups.google.com/forum/#!searchin/clojure/currying$20hickey|sort:date/clojure/TjvA5AQArUs/9bN78s4w-VkJ

现在Clojure的核心函数库中没有任何名为“appl”的函数。我不知道它的历史,也未曾意识到它,直到我在旧的Google论坛消息中进行关键字搜索。

这篇帖子还说明了为什么+不能像变长操作一样进行柯里化

(+) ;=> 0
(+ n) ;=> n -- 并不意味着“加n”
(+ 1 2 3 4) ;=> 10
by
编辑 by
我认为这是有意义的!由于它支持变长参数和关键字参数,所以不可能有自动柯里化。

然而,您可以编写一个柯里化函数,该函数接收一个可变长度和一个按该方式工作的函数。或者,已经提出了许多宏。尽管如此,引入这种行为可能会让一些人感到困惑。感谢您的见解!
+1投票
by

如果您不介意使用外部库,Clojure中也可以实现柯里化

https://dragan.rocks/articles/18/Fluokitten-080-Fast-function-currying-in-Clojure

...