Haskell自制的monad变压器无法在GHCi中显示自己

时间:2015-06-02 20:06:33

标签: haskell ghci monad-transformers winghci

我正在使用http://www.cs.nott.ac.uk/~nhn/MGS2006/LectureNotes/lecture03-9up.pdf

中提到的简单monad变换器

我的错误处理转换器的类型为

newtype ET m a = ET (m (Maybe a))

我已经实现了所有必要的管道,我能够将它与身份monad(在我的小沙箱中称为I)和编写/编译非平凡函数结合起来。

但是我无法在屏幕上打印任何结果值。消息是:

No instance for (Show (ET I Value)) arising from a use of ‘print’

Maybe已导入。 IValue都派生Show并自行展示而不会出现问题。它与ET的混合不会显示。我看到两种方式:

  • 尝试在deriving Show的声明中插入ET m a(我在很多方面尝试获取了大量不同的错误消息)
  • 根据一些网络资源的建议创建一个可以用“独立派生声明”轻拍的可展示实例 - 到目前为止没有成功尝试过。

如何在我的REPL中显示ET I Value

1 个答案:

答案 0 :(得分:6)

独立派生的目的之一是有时编译器无法推断出创建某个实例所需的约束,即使实际的代码仍然是机械派生的。所以你只需知道给它的约束条件:

{-# LANGUAGE StandaloneDeriving, UndecidableInstances #-} 

newtype ET m a = ET (m (Maybe a))
deriving instance Show (m (Maybe a)) => Show (ET m a)