记录的 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" 需要某种约束。实际的实现也需要有点神奇,因为您也不能遍历记录中的标签。
已经有一些关于改革 Show
、such 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 的操作,等等
我看到了这个问题:
我在哪里发现我可以使用 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" 需要某种约束。实际的实现也需要有点神奇,因为您也不能遍历记录中的标签。
已经有一些关于改革 Show
、such 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 的操作,等等