Haskell 中的打印机用于 Data.Comp.Variables 中的 Subst
Posted
技术标签:
【中文标题】Haskell 中的打印机用于 Data.Comp.Variables 中的 Subst【英文标题】:Printer in Haskell for Subst in Data.Comp.Variables 【发布时间】:2019-10-30 16:12:03 【问题描述】:我有一个函数返回在这个库中定义的Subst
:
http://hackage.haskell.org/package/compdata-0.1/docs/Data-Comp-Variables.html#t:Subst
我正在尝试打印返回值。打印机应该显示从变量到术语的映射。
当我尝试打印结果时,我得到:
• No instance for (Show (Cxt NoHole CTypeF ()))
arising from a use of ‘print’
• In the expression: (print subst)
我认为这意味着我必须实现一台打印机。我知道当它是一个用户定义的类时,我可以做'派生节目'。有人能指出我应该如何打印这个吗?
另外,这是我的 CTypeF 结构。
data CTypeF a
= CVarF Int
| CArrF a a
| CIntF
| CBoolF
deriving (Eq, Data, Functor, Foldable, Traversable, Show)
它来源于show,所以我认为问题不在这里。
【问题讨论】:
Cxt
没有Show
实例,因此无论你给它什么参数都无法打印。
对不起,我是haskell的新手,我不明白你的意思。我已经知道该实例丢失了,我的问题是如何实现它。所以你是说你不能定义一个实例?
@Lana 应该仍然可以为Ctx
定义一个Show
实例。它看起来像instance (Show (f (Ctx h f a)), Show a) => Show (Ctx h f a) where <newline> show (Term x) = show x <newline> show (Hole a) = show a
。请注意,这是未经测试的,因此可能无法按您想要的方式工作,但 Show
实例看起来会符合这些原则。
【参考方案1】:
Cxt
有一个Show
实例,但它需要其f
参数才能有一个ShowF
实例。
(Functor f, ShowF f, Show a) => Show (Cxt h f a)
所以你需要让CTypeF
有一个ShowF
的实例。为此,您可以将 makeShowF
与 Template Haskell 一起使用。
$(makeShowF ''CTypeF)
【讨论】:
以上是关于Haskell 中的打印机用于 Data.Comp.Variables 中的 Subst的主要内容,如果未能解决你的问题,请参考以下文章