Debugging 哈斯克尔:有调试显示功能吗?
我想使用Debugging 哈斯克尔:有调试显示功能吗?,debugging,haskell,Debugging,Haskell,我想使用Debug.Trace.Trace打印我知道是Show的内容。就像我在Python中所做的那样 一种解决方案是将“Show a=>”添加到我想要放置跟踪的函数的签名中,以及添加到调用它的任何函数中,等等 但是如果我可以使用一些debugShow函数,如果值有,它调用show,否则会返回“--no show--”或其他什么 下面是我定义DebugShow(GHC拒绝“重复实例声明”)的失败尝试: 某种“不安全的施法”也能解决我的问题 有什么建议吗 注意-这仅用于调试目的。我没有在任何已完成
Debug.Trace.Trace
打印我知道是Show
的内容。就像我在Python中所做的那样
一种解决方案是将“Show a=>
”添加到我想要放置跟踪的函数的签名中,以及添加到调用它的任何函数中,等等
但是如果我可以使用一些debugShow
函数,如果值有,它调用show
,否则会返回“--no show--”
或其他什么
下面是我定义DebugShow
(GHC拒绝“重复实例声明”
)的失败尝试:
某种“不安全的施法”也能解决我的问题
有什么建议吗
注意-这仅用于调试目的。我没有在任何已完成的代码中使用此选项。“不安全强制转换”被称为。请遵守its中的警告;这是一种很容易导致崩溃和其他不良行为的方法。我不能绝对肯定这一点,但我认为如果不在使用站点和调用站点之间的整个调用链中添加类上下文(其中每个类型变量都是确定的),这是不可能的。这样做的原因是可操作的:至少在GHC中,每个类都由一个字典实现。因此,在使用站点,我们需要一个
Show
字典来查找a
(如果有的话)。但是要得到这个,我们需要它从确定a
的站点传下来,这需要在所有中间函数的签名中包含一些内容。也许您需要以下的一些变体:
traceShow :: (Show a) => a -> b -> b
traceShow = trace . show
在Debug.Trace中定义
约束“如果值有则调用show,否则返回”-no show--“或其他”是一个困难的约束。我认为,您需要重叠(且不连贯)的实例来定义所有类型的默认显示(可能通过unsecfeccerce或vacuum)。只需在类DebugShow中使用默认方法实现即可。这应该完全符合您的要求:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
class DebugShow a where
debugShow :: a -> String
debugShow = const "--no show--"
instance Show a => DebugShow a where
debugShow = show
@伊弗米特:谢谢。在这种情况下,我似乎可以使用“unsafeCoerce”将其“强制转换”到特定类型,但我希望将其“强制转换”到相同的未知类型,并将
Show
添加到其上下文中。我试图定义“debugShow=show.unsafeccerce
”,但由于“类型变量不明确”
”而失败了@dons:当你说via vacuum时,你是什么意思?这是一种说它无法完成的方式吗?@yairchu我的意思是真空:它呈现堆对象(即不需要显示字典)
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
class DebugShow a where
debugShow :: a -> String
debugShow = const "--no show--"
instance Show a => DebugShow a where
debugShow = show