2011-11-03 42 views
6

望着文檔的Control.Applicative,我注意到,他們對某些單子(例如IOMaybe和特別ST)實例聲明,但也有MTL單子如StateRWS沒有實例。相反,它看起來像定義了一個通用的WrappedMonad類型,我猜測它將涵蓋所有其他情況。適用於州和其他MTL單子的實例?

因此,這裏是我的問題:

  1. 爲何沒有對MTL單子Applicative實例?目前爲止,我自己能找到的最佳答案是three year old post,其中有人實施了這些實例並被忽略。

  2. WrappedMonad有什麼關係?我發現一個簡短的解釋它的post on Reddit,但我想我對如何使用它感到困惑。

最後,我希望能在一個適用風格來使用State(如爲recommended to me),但如果我有亂扔垃圾,然後它似乎我與WrappedMonad數據構造的代碼不一樣的勝利。我也可以完全忽略WrappedMonad,並且自己定義Applicative實例的方式與IO,ST等相同:returnap ......但這似乎也是愚蠢的。

+0

如果只有我們有Functor => Applicative => Monad,和(Alternative,Monad)=> MonadPlus – alternative

回答

8

該文檔僅基於base程序包的內容生成,該程序包不包含State - 因此它不包含Applicative實例。如果您查看the MTL documentation,則會看到列出的Applicative實例。

或者,你可以打開GHCI,進口Control.Monad.State和Control.Applicative,並使用:i Applicative列出的Applicative:i StateT實例來列出其StateT有實例的類(State是一個類型別名其中一個參數固定爲StateT)。要麼會表明確實存在這樣的情況。

+0

顯然我是盲目的蝙蝠。我正在查看確切的文檔,但沒有看到「Applicative」實例。 – mergeconflict

2

mtl monads的Applicative實例不能在基本文檔中列出,因爲此時沒有可用的mtl。好消息是mtl具有Applicative實例StateT for example,因爲mtl-2.0.0.0。

相關問題