2015-07-12 27 views
19

哈斯克尔咖喱的功能。 Clojure虽然没有允许partial和函数宏作为相同的方法。Rich Hickey为什么不能自动压缩Clojure函数?

我以为我记得听过/读过Hickey决定背后的原因。有人回想起那个原因是什么或者我能找到它的地方吗?

我希望从理论上学到一些东西。

+1

我认为至少有一部分原因是Clojure不是100%懒惰和不能推迟申请 –

+3

你的第一句话是不准确的。无论提供多少个参数,Haskell curries * all *函数。实际上,所有的Haskell函数都需要一个输入并返回一个输出。 https://wiki.haskell.org/Currying https://wiki.haskell.org/Composing_functions_with_multiple_values。在Haskell中,** uncurry **函数实际上并不会实现;相反,它采用链中的前两个函数并将它们组合成一个函数,它将** pair **作为其单个输入。 – itsbruce

+3

向哈斯克尔咖喱致敬。 – rem

回答

26

由于函数可以有多个arities,所以可以直接调用函数而不是curry函数。接下来,如果你只有一个参数,并且你错过了一个参数,arity错误不会被检测到,而是产生一个curry函数。一个非常糟糕和困难的情况下进行调试,特别是如果该函数返回一个具有相同问题的函数,或者如果函数作为参数传递给另一个函数。

因此,特别创建一个柯里函数似乎是合法的。

+3

我正在研究Clojure的一些启发式代码,并试图使柯里和变化函数协同工作,并且我发现了您提到的相同问题。重申听取您的意见。 – Mario

+5

为了给后人以及不一定知道什么是“arities”的人提供一个具体的例子,你需要'(+ 1 2)'同时成为'3'和一个可组合的函数,因为你要求' (打印(+ 1 2))'把'3'放在控制台上(正常评估),并且'((+ 1 2)3)'是一个表达式,产生'6'(柯里)。我们知道做这两种做法(例如“教会数字”)往往会失败,像'((* 1 2)3)'也是'6'。 –

+4

而在haskell中,函数的arity是其类型的静态已知部分(例如'f :: Int - >(Int - >(Int - > Int))'),并且在部分应用程序的每个阶段,类型检查器会跟踪它的类型(例如'f 41 42 :: Int - > Int') – jberryman

相关问题