【发布时间】:2010-12-02 21:12:44
【问题描述】:
我要做的是(在我正在编写的模块中)导出一个适用于状态 monad 中特定类型的函数(在下面的示例中,该类型将是 Foo)。但是我希望用户能够在他们希望的任何MonadState 类型中使用该函数:State.Lazy、State.Strict、StateT 等。所以它需要在其外部状态单子中是多态的。
这是我想做的一个例子:
编辑有一个更好的问题:
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 => m a _ ]
标签: haskell monads typeclass state-monad