2015-07-12 25 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

相關問題