在 Haskell 中进行跟踪时,如何“显示”一个在编译时数据类型未知的值?

When tracing in Haskell, how does one `show` a value whose data type is not known at compile-time?

我在 Windows 7 和模块 Debug.Trace 上使用 GHC 8.0.2 版。 在下面的 parse 函数的跟踪中,我插入 ++ show first 导致以下错误:

我的问题:有没有办法显示有序对 (a,String) 的第一个元素,即使它的类型在编译时未知?

我的源码如下所示:

{-# LANGUAGE MonomorphismRestriction #-}

import Data.Typeable
import Data.Char
import Debug.Trace

newtype Parser a = P ( String -> [(a,String)] )

parse :: Parser a -> String -> [(a,String)]
parse (P p) input | trace
  ( let result  = (p input)
        element = head result
        first   = fst element
        second  = snd element
    in  ("parse maps " ++ input ++ " -> [(" ++ show first ++ "," ++ show second ++ ")]")
  ) False = undefined
parse (P p) input = p input

nextChar :: Parser Char
nextChar = P ( \input -> case input of { [] -> [] ; (c:cs) -> [(c,cs)] } )

我希望跟踪 parse nextChar "ABCD" 的评价。

是的,当然可以,只需按照错误中的说明操作即可:

parse :: Show a => Parser a -> String -> [(a,String)]

完成调试后,您可以删除对 trace 的调用和 Show 约束;那么您将能够再次解析无法Show的东西。