我试图调试多态函数,并希望能够打印出一些中间值。 Debug.Trace
允许我将字符串打印到屏幕上(不安全)以进行调试。
例如
buggyFunction :: (SomeConstraint a, SomeMonadStack m) => a -> m Int
buggyFunction x = do
...
trace "I'm here!" $ return ()
...
如果我想跟踪任意值,traceShow
有效但需要您调用它的值才能拥有Show
实例。在我的情况下,我知道我用于测试的a
确实有一个我可以使用的Show
实例,但我无法将其添加到我的约束中,因为其他函数则不会#39; t解决。
如果我只有一种类型我打电话,我可以使用unsafeCoerce
以及show
来电。例如,让我们说buggyFunction
适用于Int
,而在GHCi中进行测试时,我将其称为buggyFunction 5
:
buggyFunction :: (SomeConstraint a, SomeMonadStack m) => a -> m Int
buggyFunction x = do
...
trace ("I'm here with value " ++ show (unsafeCoerce x :: Int)) $ return ()
...
由于unsafeCoerce
需要具体类型,我无法将其用作unsafeCoerce :: a -> (Show b => b)
如果我不知道a
的特定类型,我怎么能这样做,但我知道它会有Show
的实例?