2013-10-03 39 views
1

我試圖讓StateMonadPlusMonadState的一個實例。我的獲取和放置類型簽名有什麼問題?

data StateMonadPlus s a = StateMonadPlus (s -> Either String (a, s)) 

instance MonadState s (StateMonadPlus s) where 
    -- get :: StateMonadPlus s 
    get = StateMonadPlus (\s -> Right (s, s)) 
    -- put :: s -> StateMonadPlus() 
    put s = StateMonadPlus (\_ -> Right ((), s)) 

代碼編譯就好了,但是當我取消對種獲取和說,它的抱怨

A3.hs:17:5: Misplaced type signature: get :: StateMonadPlus s 

A3.hs:19:5: Misplaced type signature: put :: s -> StateMonadPlus() 

有什麼問題的類型?

回答

3

由於類型簽名不屬於此處,因此會出現編譯器錯誤。您不能在實例聲明中放置類型簽名,因爲類型已經由類聲明中的簽名確定。

但是,如果您取消註釋,那並不是說簽名是正確的。的getput類型簽名是

get :: MonadState s m => m s 

put :: MonadState s m => s -> m() 

所以「正確的」類型簽名

get :: StateMonadPlus s s 

put :: s -> StateMonadPlus s() 

寫入時的類實例我傾向於做同樣的事情,你在你的問題做了 - 我編寫類型簽名但將其註釋掉,以便稍後再回來時更容易理解實例。