與面向堆棧的語言相比,Haskell語法需要相對較嘈雜的f . g $ 3
而不是3 g f
。這個選擇的主要設計參數是什麼?爲什麼選擇函數應用程序作爲默認的Haskell運算符,而不是組合?
回答
這也可以寫成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的語義,並在其核心的演算這種安排的任何其他方法將不良相互作用與語言。
我的猜測是演算和有用性(在現實世界的情景)。
在演算,空間應用,因此它的感覺更類似於誰知道它的人。
在最常用的語言,平常的事情做一個功能就是應用它。 Haskell不是基於堆棧的語言,因此選擇是在那裏完成的。
- 的面向堆棧式不那麼多組成如序列功能;
3 g f
就是這樣一種語言,而是在Haskell中f $ g $ 3
。當然,這相當於f . g $ 3
,但只有當您立即將合成應用於某個值時,它纔會起作用。在Haskell中,你經常編寫函數來將它們交給一些更高階的combinator,或者做一個沒有意義的定義。在需要某種顯式模塊的面向堆棧的語言中,在Haskell中只需要.
運算符。 通常,你不只是鏈接「原子」功能。當然,你不會處理全球命名的單字母函數,所以這個微小的
.
或$
實際上並沒有明顯的明顯差異。並且經常地,如rmmh所說,您鏈部分應用功能,例如,main = interact $ unlines . take 10 . filter ((>20) . length) . lines
沒有便宜的緊密綁定應用程序,這會更麻煩。此外,將單獨的
.
標記爲尚未立即應用但僅由其組成的內容是非常自然的。
如果你有興趣在Haskell,胡達克,休斯,歷史佩頓瓊斯& Wadler的"A History of Haskell: Being Lazy with Class"是關於這一主題的最知名的紙,和良好的值得一讀。
它並沒有直接解決你的問題,但它確實指出了一個非常相關的事實:Haskell被創建爲一個小團隊現有語言之間的統一折衷。引用第2.2節(「巴別塔」):
由於所有這些活動的結果,由80年代中期出現了許多研究者,包括作家,誰是在設計非常感興趣,並純懶惰語言的實現技術。事實上,我們很多人都獨立設計了我們自己的懶惰語言,並忙於爲他們構建自己的實現。我們每個人都在寫關於我們工作的文件,在我們描述我們的實現技術之前,我們首先必須描述我們的語言。那巴別這個懶塔貢獻的語言包括:
- 米蘭達[...]
- 懶惰ML(LML)[...]
- 奧威爾[...]
- Alfl [...]
- 標識[...]
- 清潔[...]
- 思考[...]
- 菊花[...]
所以答案可能就是Haskell從它的前輩語言中複製了它。而且,由於一些這些語言反過來是基於Lisp和ML的靈感,或者受到Lisp和ML的啓發,他們可能會類似地從它們中複製它們。回覆引用你的問題:
這個選擇的主要設計參數是什麼?
機會是,從來沒有一個可持續的選擇的選擇。無論如何,很少有高級語言用於基於堆棧的設計,很少有人知道它們。
- 1. 爲什麼typeof被稱爲運算符而不是函數?
- 2. 爲什麼使用'op_Addition'作爲運算符'+'而不是名稱'+'?
- 3. 爲什麼不允許作爲Haskell中綴運算符?
- 4. 爲什麼不是Haskell部分應用程序工作?
- 5. Haskell中函數應用程序運算符的使用
- 6. 爲什麼Angular默認不選擇正確的選擇選項?
- 7. 爲什麼不應該在函數中使用「=」R運算符?
- 8. 爲什麼不是默認
- 9. 爲什麼「==」運算符不起作用
- 10. 試圖瞭解Haskell中的函數應用程序運算符
- 11. Rails:爲什麼不使用默認的應用程序佈局?
- 12. 爲什麼在選擇方法中使用OR運算符而不是AND運算符?
- 13. 爲什麼Postgres Hstore索引適用於? (運算符)而不是EXIST(函數)?
- 14. 爲什麼空函數組合在Haskell中工作?
- 15. 爲什麼在C中的printf函數不是模運算符?
- 16. 爲什麼++運算符將整數增加4而不是1?
- 17. 默認的默認構造函數,爲什麼不是用戶提供的默認構造函數?
- 18. '='運算符的默認操作是什麼?
- 19. Haskell美元運算符應用程序
- 20. 使用選擇值作爲運算符
- 21. 選擇/選項元素的默認「搜索」行爲是什麼?
- 22. 爲什麼選擇0,...,而不是SELECT
- 23. 爲什麼Ruby使用=〜而不是〜=來匹配運算符?
- 24. 爲什麼使用new運算符而不是std :: vector?
- 25. 爲什麼不應用默認樣式?
- 26. 爲什麼我的程序打印默認構造函數?
- 27. 爲什麼使用AUFS作爲默認的Docker存儲後端而不是devicemapper?
- 28. 爲什麼==運算符不像char數組那樣工作?
- 29. 我可以在Swift中使用運算符作爲默認函數參數嗎?
- 30. 爲什麼Angular 2不加載默認的應用程序根組件?
據我記得,甚至沒有任何其他方式進行討論。哈斯克爾的血統讓他們選擇顯而易見。 – augustss