2014-01-27 15 views

回答

12

這也可以寫成f (g 3)

爲什麼哈斯克爾不是拼接的語言?

基於A History of Haskell,它是由多種函數式編程和懶惰的語言實驗,包括ML的影響。作爲第4節,語法描述:

鑽營

繼傳統可以追溯到弗雷格的兩個參數的函數可以表示爲一個說法,自己返回一個參數的函數的函數。摩西Scḧonfinkel和哈斯克爾咖喱磨練了這個傳統,並被稱爲咖喱。功能應用程序由並列表示並關聯到左側。因此,f x y被解析(f x) y。這導致簡潔和強大的代碼。例如,要將每個數字排列在列表中,我們編寫map square [1,2,3],同時在列表中列出我們編寫的每個數字map (map square) [[1,2],[3]]。哈斯克爾,像基於演算許多其他語言,同時支持咖喱和uncurried定義,

鑽營的概念是如此重要的Haskell的語義,並在其核心的演算這種安排的任何其他方法將不良相互作用與語言。

+2

據我記得,甚至沒有任何其他方式進行討論。哈斯克爾的血統讓他們選擇顯而易見。 – augustss

1

我的猜測是演算和有用性(在現實世界的情景)。

在演算,空間應用,因此它的感覺更類似於誰知道它的人。

在最常用的語言,平常的事情做一個功能就是應用它。 Haskell不是基於堆棧的語言,因此選擇是在那裏完成的。

11
  1. 的面向堆棧式不那麼多組成序列功能; 3 g f就是這樣一種語言,而是在Haskell中f $ g $ 3。當然,這相當於f . g $ 3,但只有當您立即將合成應用於某個值時,它纔會起作用。在Haskell中,你經常編寫函數來將它們交給一些更高階的combinator,或者做一個沒有意義的定義。在需要某種顯式模塊的面向堆棧的語言中,在Haskell中只需要.運算符。
  2. 通常,你不只是鏈接「原子」功能。當然,你不會處理全球命名的單字母函數,所以這個微小的.$實際上並沒有明顯的明顯差異。並且經常地,如rmmh所說,您鏈部分應用功能,例如,

    main = interact $ unlines . take 10 . filter ((>20) . length) . lines 
    

    沒有便宜的緊密綁定應用程序,這會更麻煩。此外,將單獨的.標記爲尚未立即應用但僅由其組成的內容是非常自然的。

2

如果你有興趣在Haskell,胡達克,休斯,歷史佩頓瓊斯& Wadler的"A History of Haskell: Being Lazy with Class"是關於這一主題的最知名的紙,和良好的值得一讀。

它並沒有直接解決你的問題,但它確實指出了一個非常相關的事實:Haskell被創建爲一個小團隊現有語言之間的統一折衷。引用第2.2節(「巴別塔」):

由於所有這些活動的結果,由80年代中期出現了許多研究者,包括作家,誰是在設計非常感興趣,並純懶惰語言的實現技術。事實上,我們很多人都獨立設計了我們自己的懶惰語言,並忙於爲他們構建自己的實現。我們每個人都在寫關於我們工作的文件,在我們描述我們的實現技術之前,我們首先必須描述我們的語言。那巴別這個懶塔貢獻的語言包括:

  • 米蘭達[...]
  • 懶惰ML(LML)[...]
  • 奧威爾[...]
  • Alfl [...]
  • 標識[...]
  • 清潔[...]
  • 思考[...]
  • 菊花[...]

所以答案可能就是Haskell從它的前輩語言中複製了它。而且,由於一些這些語言反過來是基於Lisp和ML的靈感,或者受到Lisp和ML的啓發,他們可能會類似地從它們中複製它們。回覆引用你的問題:

這個選擇的主要設計參數是什麼?

機會是,從來沒有一個可持續的選擇的選擇。無論如何,很少有高級語言用於基於堆棧的設計,很少有人知道它們。

相關問題