2010-11-18 25 views
5

我在讀LYAH。它說,我需要顯式地加載Control.Monad.Instances得到以下語法工作:爲什麼不用( - >)默認實現Control.Monad.Instances

((fmap (+5)) (+5)) 4 

這是爲什麼?爲什麼如果仿函數是這種基礎和統一的技術,我必須明確加載Control.Monad.Instances來獲得該功能。 ( - >)如何在沒有它的情況下實現(或者只是隱藏並且只導出->)?爲什麼不使用fmap而不是默認實現的函數類型?

+0

另請參閱http://stackoverflow.com/questions/4204086/is-the-monad-w-instance-anywhere-standard – 2011-05-02 23:11:35

回答

10

這裏涉及3種不同的概念。函數類型,Functor類型類和Functor「實例」。函數類型( - >)嵌入語言中,其存在和實現與Functor和fmap完全無關。類型類是其關聯方法的簽名規範。 「實例」是該簽名的實現。

所以爲了讓你的問題更清楚一些,我會重新將它稱爲「爲什麼Prelude中提供的( - >)Functor實例不是?」 (Prelude是默認情況下處於範圍內的模塊)。就目前來說,這並沒有太大的意義。

修改後的問題的答案很簡單:Haskell報告(官方語言規範,Prelude接口被指定的地方)不包括它。可以說,它應該,但Haskell語言和庫自那時起已經發展了很多,而Haskell標準往往變化緩慢。無論如何,對或錯,這就是爲什麼。

2

函子不是一種語言功能,它只是一個有用的類型類,隨機模塊恰好定義。要使用該模塊的Functor定義,您必須加載它,故事結束。

相關問題