请在 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

已选择
 
最佳答案

我不知道这个问题的完整答案,但下面是关于如何在Clojure中添加柯里化功能的讨论链接,Rich Hickey于2008年10月对某个特定建议作出了回应。

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

Rich 很清楚柯里化是什么,至于它被认为有多重要,我就不知道了。匿名函数和 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

...