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
已导入。 I
和 Value
派生 Show
并自行显示,没有问题。与 ET
的混合不会显示。我看到两种方式:
- 尝试在
ET m a
的声明中插入 deriving Show
(我尝试了很多方法获得了很多不同的错误消息)
- 按照一些网络资源的建议,创建一个使用 "Stand-alone deriving declarations" 涂抹的可显示实例 - 到目前为止没有成功。
如何在我的 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)
我正在使用 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
已导入。 I
和 Value
派生 Show
并自行显示,没有问题。与 ET
的混合不会显示。我看到两种方式:
- 尝试在
ET m a
的声明中插入deriving Show
(我尝试了很多方法获得了很多不同的错误消息) - 按照一些网络资源的建议,创建一个使用 "Stand-alone deriving declarations" 涂抹的可显示实例 - 到目前为止没有成功。
如何在我的 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)