【发布时间】:2018-09-07 22:35:51
【问题描述】:
出于调试目的,我想show 一些值嵌套在我的程序逻辑的各个部分。但是,并非总是如此,我试图show 有一个Show 实例。是否有可能以某种方式假设它确实有一个有效的实例并将可能丢失的字典的发生推迟到运行时?我知道我可以将约束添加到我想要执行showing 的函数的上下文中,需要注意的是我可能需要在整个程序中更改许多签名。我正在寻找类似的功能,例如:
coerceTrace :: forall a b . a -> b -> b
coerceTraceId :: forall a . a -> a
这在内部会产生一个 Show a 与 Debug.Trace 系列函数一起使用。
我知道我们有unsafeCoerce,但它是否可以用来生成约束对我来说并不明显。
【问题讨论】:
-
您是否尝试过使用ghci debugging 而不是 printf-debugging,或者甚至更好地编写小测试用例来捕获程序逻辑中的错误?
-
GHC 在运行时不保留类型信息:类型在编译期间被擦除。泛型类型
a的参数大致作为无类型指针传递。除了传递/返回它之外,没有其他方法可以使用该参数,因为要访问指向的数据,需要知道它的类型,因此要知道要读取多少字节,以及如何解释它们。 -
如果您知道运行时类型,即
Show类型,您可以使用不安全强制将该值“强制转换”为运行时类型,之后您可以使用Show。然而,这是一个很大的“如果”。
标签: haskell