我正在做的是(在我正在編寫的模塊中)導出一個在狀態monad中的特定類型上工作的函數(在下面的示例中,該類型將是Foo
)。不過,我希望用戶能夠使用他們希望的任何MonadState
類型的函數:State.Lazy
,State.Strict
,StateT
等。因此,它需要在其外部狀態monad中具有多態性。爲特定狀態數據類型導出一個多態MonadState函數
這裏是想我做的一個例子:
EDITED有一個更好的問題:
import Control.Monad.State
data Foo a = Foo { cnt :: Int, val :: a }
--test :: State (Foo a) a -- THIS WORKS
--test :: StateT (Foo a) Maybe a -- ...SO DOES THIS
-- ... BUT INCLUDING THE FOLLOWING SIGNATURE GIVES AN ERROR:
test :: MonadState (Foo a) m => m a
test = modify (\(Foo i a)-> Foo (i+1) a) >> gets val
GHC抱怨FlexibleInstances擴展需要定義上述類型。是使用該擴展的正確方式來定義我的功能還是有更好的方法?
謝謝
像這樣的事情或許應該工作 - 我怕我不能在此刻測試它(和它越來越格式化):[_ test :: MonadState(Foo a)m => ma _] – 2010-12-02 21:33:54