我正在使用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
已导入。 I
和Value
都派生Show
并自行展示而不会出现问题。它与ET
的混合不会显示。我看到两种方式:
deriving Show
的声明中插入ET m a
(我在很多方面尝试获取了大量不同的错误消息)如何在我的REPL中显示ET I Value
?
答案 0 :(得分:6)
独立派生的目的之一是有时编译器无法推断出创建某个实例所需的约束,即使实际的代码仍然是机械派生的。所以你只需知道给它的约束条件:
{-# LANGUAGE StandaloneDeriving, UndecidableInstances #-}
newtype ET m a = ET (m (Maybe a))
deriving instance Show (m (Maybe a)) => Show (ET m a)