【问题标题】:Exporting a polymorphic MonadState function for a particular state data type为特定状态数据类型导出多态 MonadState 函数
【发布时间】:2010-12-02 21:12:44
【问题描述】:

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

这是我想做的一个例子:

编辑有一个更好的问题:

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


【解决方案1】:

你不能只使用 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

【讨论】:

  • 我应该在我的原始帖子中包含您提供的类型签名,但它被遗漏了。已编辑。我想我真正的问题是这个 FlexibleContexts 标志是否是正确(或唯一)的方法。
  • 是的,我相信 FlexibleContexts 是必要的。它是向 Haskell Prime 提出的,我打赌其他 Haskell 编译器(jhc、uhc)已经或将要支持它,所以我不会努力避免它。
猜你喜欢
  • 1970-01-01
  • 2019-10-17
  • 2015-12-28
  • 2016-12-24
  • 2016-04-15
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多