【问题标题】:Purescript default `Show` instance for records用于记录的 Purescript 默认“显示”实例
【发布时间】:2017-02-16 19:30:46
【问题描述】:

我看到了这个问题:

我发现我可以使用 purescript-debug 来打印它,例如通过使用:

> traceAny {a:1} id
{ a: 1 }
unit

我想知道为什么没有默认的 Show 实例用于记录:

> {a:1}
Error found:
in module $PSCI

  No type class instance was found for

    Data.Show.Show { "a" :: Int
                   }

【问题讨论】:

    标签: purescript


    【解决方案1】:

    Show 只是作为库代码实现的,因此无法编写可以容纳所有可能记录的实例。需要有某种约束,例如,您可以说“此记录中每个值的类型也必须具有Show 实例”。实际的实现也需要有点神奇,因为您也不能遍历记录中的标签。

    已经有一些关于改革Showsuch as this one 的讨论,这可能会解决这个问题,使Show 完全具有魔力,并且只能用于调试目的。

    虽然这并不能真正解决您在这里遇到的情况,但可以依靠 Generic 派生为 newtype'd 记录创建 Show 实例,这可以减轻一些痛苦这种事情:

    import Data.Generic (class Generic, gShow)
    
    newtype MyRecord = MyRecord { a :: Int }
    
    derive instance genericMyRecord :: Generic MyRecord
    
    instance showMyRecord :: Show MyRecord where
      show = gShow
    

    如果您也派生了Newtype,它会使记录更易于使用,因为您可以使用各种有助于在新类型下包装/解包/操作等的操作。

    【讨论】:

    • 谢谢gb。我一直认为记录类似于原始类型。
    • 当你的 newtype/data 声明有一个类型变量时,你如何做到这一点? IE。它是* -> * 而不仅仅是*
    • 您还需要在类型变量上包含一个约束。因此,您将拥有instance name :: Class a => Class (Type a),而不是instance name :: Class Type
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2020-11-16
    • 1970-01-01
    • 2016-09-25
    • 2011-12-12
    相关资源
    最近更新 更多