跟踪调试没有Show约束的多态类型

时间:2018-01-03 22:23:16

标签: haskell

我试图调试多态函数,并希望能够打印出一些中间值。 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的实例?

0 个答案:

没有答案