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

lev*_*ied 5 purescript

我看到了这个问题:

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

> traceAny {a:1} id
{ a: 1 }
unit
Run Code Online (Sandbox Code Playgroud)

我想知道没有Show记录的默认实例背后的理由是什么:

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

  No type class instance was found for

    Data.Show.Show { "a" :: Int
                   }
Run Code Online (Sandbox Code Playgroud)

gb.*_*gb. 6

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

已经有一些关于改革的讨论Show,比如这个,可以解决这个问题,通过Show完全神奇,只能用于调试目的.

虽然这并没有真正解决你在这里的情况,但可以依靠Generic派生Shownewtype'd记录创建一个实例,这可以消除这种事情的一些痛苦:

import Data.Generic (class Generic, gShow)

newtype MyRecord = MyRecord { a :: Int }

derive instance genericMyRecord :: Generic MyRecord

instance showMyRecord :: Show MyRecord where
  show = gShow
Run Code Online (Sandbox Code Playgroud)

如果你也得到Newtype它,它使记录更容易使用,因为你可以使用各种操作,帮助在newtype下包装/解包/操作等.