记录的 Purescript 默认“Show”实例

Purescript default `Show` instance for records

我看到了这个问题:

我在哪里发现我可以使用 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
                   }

Show 只是作为库代码实现的,因此无法编写一个实例来容纳所有可能的记录。例如,您可以说 "the type of every value in this record must also have a Show instance" 需要某种约束。实际的实现也需要有点神奇,因为您也不能遍历记录中的标签。

已经有一些关于改革 Showsuch as this one 的讨论,这可能会解决这个问题,方法是使 Show 完全神奇,并且仅可用于调试目的。

虽然这并没有真正解决你在这里遇到的问题,但可以依靠 Generic 派生来为 newtype 的记录创建一个 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,那么它会使记录更易于使用,因为您可以使用各种有助于在新类型下 wrapping/unwrapping/operating 的操作,等等