2015-04-15 60 views
4

我承認這個問題有點不明確,但我想知道爲什麼我從來沒有偶然發現過Haskell中函子monique的類型類。我是否錯過了它,這種缺席是否有充分理由,還是完全是由於歷史原因?恕我直言,下面的繼承圖看起來有點古怪沒有右上角:「這是什麼從Functor箭頭的真正含義是」爲什麼Haskell中沒有用於函數的monoids類型?

Functor 
    | 
    V 
Applicative ––> Alternative 
    |    | 
    V    V 
    Monad ––> MonadPlus 
+0

你可以隨時添加它(如果可以合理定義的話,可能還會有一些CT庫) - 我的最佳猜想:那裏只有沒有/沒有足夠的用例 – Carsten

+0

我不同意你總是可以添加它,因爲你不能使它成爲Alternative的超類。我也認爲(幾乎)Alternative/MonadPlus的每個用例實際上都是這個缺失類的用例。但也許我在這裏有點過於理想化。 –

+4

「Monoid」課程是不是已經涵蓋了這個?你能詳細說明一下你認爲這個班級應該超出'Monoid'已經提供的那些方法嗎? –

回答

7

一個值得考慮的關鍵因素是,如果沒有公理統一FunctorFunctorPlus那麼你可能只是定義instance Monoid (F t) where ...並與它做。那麼你在尋找什麼公理 - 只是fmap f fempty = fempty或者fmap f x <|> fmap f y == fmap f (x <|> y) ......?

另一個關鍵因素是缺乏有趣的結構,它是仿函數而不是應用。可能有一個爭論與泛型編程有關(元編程deriving關鍵字),其中所有東西都是產品的總和,因此我們可以從* -> *得到Applicative,但我不知道細節。唯一的價值FunctorPlus可能是「做同樣的事情,替代方案不適用於Functors」,所以如果這個集合非常小,那麼顯然沒有太多附加值。

+4

我不同意你的前提,即不適用的仿函數不相關。即使應用實例是_possible_,它通常既不明顯也不真正有用。而一個'Functor'實例總是規範的 - 如果可能的話,那麼它的行爲就不會有歧義,實例可以通過'-XDeriveFunctor'實例自動添加。 – leftaroundabout

+0

@leftroundabout我同意你的不同意見。從「這裏有一些原因可能還沒有完成」這個意義上來說,這是一個答案,不是,「這就是爲什麼它不能/不應該完成」,所以我只是說「你可以通常使用幺半羣,通常情況下函數是可應用的。「 –

+0

我很想說我想選擇這樣的公理,這樣'FunctorPlus'就像'Alternative'添加到'Applicative'一樣爲'Functor'增加了很多。無論這意味着什麼。但我剛剛注意到'Alternative'只不過是一個'Monoid'。所以,也許我應該要求在'Applicative' +'Monoid'上實際使用'Alternative'。無論如何,再次考慮我的用例,讓我意識到「FunctorPlus」對它沒有任何幫助。 –

相關問題