欢迎!请查看关于页面以获取更多关于 nasıl işlediğini bilgisi。
今天我脑海中闪过一个想法:在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对向Clojure添加柯里化功能的建议进行了回应。
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函数。我不知道它的历史,直到通过旧谷歌群组消息的关键字搜索才意识到它。
如果你不介意使用外部库,Clojure 中可以实现柯里化
https://dragan.rocks/articles/18/Fluokitten-080-Fast-function-currying-in-Clojure