0

我正在尝试做的是(在我正在编写的模块中)导出一个适用于状态单子中特定类型的函数(在下面的示例中,该类型将是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 扩展来定义上述类型。使用该扩展是定义我的功能的正确方法还是有更好的方法?

谢谢

4

1 回答 1

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

于 2010-12-02T21:38:28.860 回答