Haskell自制的monad变压器无法在GHCi中显示
我正在尝试中介绍的简单的monad变压器 我的错误处理转换器具有类型Haskell自制的monad变压器无法在GHCi中显示,haskell,ghci,monad-transformers,winghci,Haskell,Ghci,Monad Transformers,Winghci,我正在尝试中介绍的简单的monad变压器 我的错误处理转换器具有类型 newtype ET m a = ET (m (Maybe a)) 我已经实现了所有必要的管道,我能够将它与identity monad(在我的小沙箱中称为I)结合起来,并编写/编译非平凡的函数 但我无法在屏幕上打印任何结果值。信息是: No instance for (Show (ET I Value)) arising from a use of ‘print’ 也许是进口的。I和Value派生都可以自己显示,没有问题
newtype ET m a = ET (m (Maybe a))
我已经实现了所有必要的管道,我能够将它与identity monad(在我的小沙箱中称为I)结合起来,并编写/编译非平凡的函数
但我无法在屏幕上打印任何结果值。信息是:
No instance for (Show (ET I Value)) arising from a use of ‘print’
也许是进口的。I和Value派生都可以自己显示,没有问题。这是与ET的混合不会显示。我认为有两种方式:
尝试在ET m a声明中插入派生显示,我尝试以多种方式获取许多不同的错误消息
按照一些web资源的建议,创建一个带有独立派生声明的可展示实例——到目前为止还没有成功尝试过。
如何在REPL中显示ET I值?独立派生的目的之一是,有时编译器无法推断生成某个实例所需的约束,即使实际代码仍然是机械派生的。因此,您只需要知道要给它什么约束:
{-# LANGUAGE StandaloneDeriving, UndecidableInstances #-}
newtype ET m a = ET (m (Maybe a))
deriving instance Show (m (Maybe a)) => Show (ET m a)
独立派生的目的之一是,有时编译器无法推断生成特定实例所需的约束,即使实际代码仍然是机械派生的。因此,您只需要知道要给它什么约束:
{-# LANGUAGE StandaloneDeriving, UndecidableInstances #-}
newtype ET m a = ET (m (Maybe a))
deriving instance Show (m (Maybe a)) => Show (ET m a)
非常感谢。完美的为什么在这种情况下,派生行没有缩进?我认为它属于newtype声明。不是吗?不-独立派生引入了新的语法,派生实例,它甚至不需要与数据类型位于同一个模块中。这两行是独立的声明,谢谢。完美的为什么在这种情况下,派生行没有缩进?我认为它属于newtype声明。不是吗?不-独立派生引入了新的语法,派生实例,它甚至不需要与数据类型位于同一个模块中。这两行是独立的声明。