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

Haskell 导出特定状态数据类型的多态MonadState函数,haskell,monads,typeclass,state-monad,Haskell,Monads,Typeclass,State Monad,我试图做的是(在我编写的模块中)导出一个函数,该函数在状态monad中的特定类型上工作(在下面的示例中,该类型将是Foo)。但是,我希望用户能够在任何他们希望的MonadState类型中使用该函数:State.Lazy、State.Strict、StateT,等等。因此它需要在外部状态monad中具有多态性 下面是我想做的一个例子: 编辑了一个更好的问题: import Control.Monad.State data Foo a = Foo { cnt :: Int, val :: a }

我试图做的是(在我编写的模块中)导出一个函数,该函数在状态monad中的特定类型上工作(在下面的示例中,该类型将是
Foo
)。但是,我希望用户能够在任何他们希望的
MonadState
类型中使用该函数:
State.Lazy
State.Strict
StateT
,等等。因此它需要在外部状态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 extension来定义上述类型。使用该扩展是定义函数的正确方法还是有更好的方法


谢谢

您不能只使用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中使用的,类似的东西可能会起作用-我恐怕目前无法测试它(而且它正在变得无格式):[\uTest::MonadState(Foo a)m=>m a]我应该包括您在我的原始帖子中提供的类型签名,但它被遗漏了。编辑。我想我真正的问题是这个FlexibleContexts标志是否是正确的(或唯一的)方法。是的,我相信FlexibleContexts是必要的。有人建议使用Haskell Prime,我打赌其他Haskell编译器(jhc、uhc)现在或将来都会支持它,所以我不会太努力避免它。