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的主要内容,如果未能解决你的问题,请参考以下文章

基于 Haskell 中的字符串映射证明打印函数的穷举性

如何正确使用haskell中的长度函数?

Haskell中的PNG到BMP(用于光泽)

如何在 haskell 中打印列表?

Haskell 打印阶乘

Haskell 中的音频和信号处理