Haskell 导出特定状态数据类型的多态MonadState函数
我试图做的是(在我编写的模块中)导出一个函数,该函数在状态monad中的特定类型上工作(在下面的示例中,该类型将是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 }
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)现在或将来都会支持它,所以我不会太努力避免它。