1

我正在使用http://www.cs.nott.ac.uk/~nhn/MGS2006/LectureNotes/lecture03-9up.pdf中介绍的简单单子变换器

我的错误处理变压器有类型

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

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

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

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

Maybe是进口的。两者都可以自行导出I和显示,没有问题。这是不会显示的混合。我看到两种方法:ValueShowET

  • 尝试插入(我尝试以多种方式获得许多不同的错误消息)deriving Show的声明ET m a
  • 正如一些网络资源所建议的那样,创建一个带有“独立派生声明”的可展示实例 - 到目前为止没有成功尝试。

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

4

1 回答 1

6

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

{-# LANGUAGE StandaloneDeriving, UndecidableInstances #-} 

newtype ET m a = ET (m (Maybe a))
deriving instance Show (m (Maybe a)) => Show (ET m a)
于 2015-06-02T20:27:48.590 回答