Purescript默认`Show`实例用于记录

时间:2017-02-16 19:30:47

标签: purescript

我看到了这个问题:

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

1 个答案:

答案 0 :(得分:6)

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

有一些关于改革Showsuch as this one的讨论,通过使Show完全神奇,只能用于调试目的,可以解决这个问题。

虽然这并没有真正解决您在这里的情况,但可以依靠Generic派生为Show'制作newtype个实例。记录,这可以消除这种事情的一些痛苦:

import Data.Generic (class Generic, gShow)

newtype MyRecord = MyRecord { a :: Int }

derive instance genericMyRecord :: Generic MyRecord

instance showMyRecord :: Show MyRecord where
  show = gShow

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