2014-03-03 103 views
2

我在理解類型參數在狀態monad的情況下表示什麼類型的問題,以及其他mtl單子也有點麻煩。據我瞭解,當我撰寫一個國家monad,如在State String Int,我真正有StateT String Identity Int。對於MonadState typeclass的方法get,它返回m s,這種情況下'm'是什麼?它是身份monad,Identity Int嗎?在這種情況下,'s'表示'm'的參數狀態類型?瞭解類型類聲明中的類型參數

謝謝,我明顯對理解Haskell的類型系統有點麻煩。

回答

6

那它取決於你使用什麼樣的實例 - 這是類型類的全部要點!

class MonadState s m where 
    get :: m s 

在簡單State情況下,這就是你所在的單子:

instance MonadState String (State String) where 
    get :: State String String 

...這是短期的

instance MonadState String (StateT String Identity) where 
    get :: (StateT String Identity) String 

OTOH,它也可能是

instance MonadState Int (StateT Int IO) where 
    get :: StateT Int IO Int 
+0

好的,謝謝,這回答我的問題,我現在明白了這個例子。現在我只需要更多地瞭解變形金剛! – hcaulfield57

3

如果我們看defini的StateT重刑:

class (Monad m) => MonadState s m | m -> s where 
    get :: m s 
    put :: s -> m() 

這對於StateT實例定義爲

instance (Monad m) => MonadState s (StateT s m) where 
    get = StateT.get 
    put = StateT.put 

,那麼我們說

type State s a = StateT s Identity a 

那麼我們知道,在這種情況下,m ~ Identity。對於你的情況State String Int,我們也可以推斷出s ~ Stringa ~ Int,所以get的類型是Identity String,而put的類型是Identity()