为特定状态数据类型导出多态MonadState函数

时间:2010-12-02 21:12:45

标签: haskell monads typeclass state-monad

我正在尝试做的是(在我正在编写的模块中)导出一个在状态monad中处理特定类型的函数(在下面的示例中,该类型将是Foo)。但是我希望用户能够以他们希望的MonadState类型使用该函数:State.LazyState.StrictStateT等等。所以它需要是多态的在其外国monad。

以下是我想做的一个例子:

已编辑并提出更好的问题:

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扩展来定义上面的类型。使用该扩展名是正确的方法来定义我的函数还是有更好的方法?

由于

1 个答案:

答案 0 :(得分:2)

你不能只使用MonadState类型类吗?

{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.State

data Foo a = Foo { cnt :: Int, val :: a }


test :: MonadState (Foo a) m => m a
test = modify (\(Foo i a)-> Foo (i+1) a) >> gets val

它在GHCi中加载很好。

编辑:这是MTL-2.0和GHCi-7.0.1