我正在聽 Kris Nuttycombe 在 LambdaConf 2015 上發表的題為Parametricity The Essence of Information Hiding 的演講。在12:20,演講者談到為什么這個函式的定義不是map,即使它共享相同的型別簽名:
asdf :: forall a b. (a -> b) -> [a] -> [b]
輸出中的每個值都是通過將提供的函式應用于輸入的成員而獲得的。
但是 List給了實作者太多的資訊,而呼叫者太少了。
asdf :: forall a b. (a -> b) -> [a] -> [b] asdf f [] = [] asdf f (x : _) = [f x]
當然,型別簽名與map; 然而,結果是一個f應用于頭部的單例串列。
發言人說我們應該設定一個Functor限制。從那時起,我無法理解為什么會這樣。有人可以給我任何指點嗎?
uj5u.com熱心網友回復:
說話者主張支持型別。他想向觀眾展示在某些情況下可以使用型別來限制可能的實作。當他到達
asdf :: forall a b. (a -> b) -> [a] -> [b]
他解釋說,這將允許多個實作,但切換到Functor約束將有助于實作這一點。
asdf :: Functor f => (a -> b) -> f a -> f b
他似乎還把他的談話分成了第一部分,他忽略了更詳細的觀點來傳達他的主要資訊,第二部分他進入了一些更詳細的觀點。值得一提的是,我分享了您對第一部分中演講者論點的困惑,我認為這是快速而松散的推理。我認為你也不應該挖得太深。
最后,您可能會喜歡 Edward Kmett 的 fmap 的免費定理,其中還列出了fmap的免費定理fmap并提供了指向 Philip Wadler 的免費定理的鏈接!.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/345087.html
上一篇:如何編譯第一個haskell程式
下一篇:Haskell:獲取所有路徑
