Haskell 自制的 monad transformer 无法在 GHCi 中展示自己

Haskell home-made monad transformer unable to Show itself in GHCi

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

中介绍的简单 monad 转换器

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

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

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

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

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

Maybe 已导入。 IValue 派生 Show 并自行显示,没有问题。与 ET 的混合不会显示。我看到两种方式:

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

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

{-# LANGUAGE StandaloneDeriving, UndecidableInstances #-} 

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