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

欢迎!请查看关于页面以获取更多关于 nasıl işlediğini bilgisi。

+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对向Clojure添加柯里化功能的建议进行了回应。

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函数。我不知道它的历史,直到通过旧谷歌群组消息的关键字搜索才意识到它。

这篇帖子还讨论了为什么+既不能柯里化,也必须支持可变参数

(+) ;=> 0
(+ n) ;=> n – 并不代表“加n”
(+ 1 2 3 4) ;=> 10

编辑
我认为这是有道理的!由于支持可变参数和关键字参数,因此不可能实现自动柯里化。

然而,你可以编写一个接受阶数和函数的 curry 函数,或者也可以提出各种宏。但是,引入这种行为可能会让人们对柯里化失望。感谢你的见解!
+1

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

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

...