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

在Haskell中进行跟踪时,如何“显示”编译时数据类型未知的值?,haskell,show,trace,Haskell,Show,Trace,我在Windows 7上使用GHC 8.0.2版,&moduleDebug.Trace。 在下面的parse函数的跟踪中,我插入++show first会导致以下错误: (Show a)没有因使用“Show”而引起的实例 可能的解决方案: 将(显示a)添加到 以下项的类型签名: parse::Parser a->String->[(a,String)] 在(++)的第一个参数中,即show first' 在(++)的第二个参数中,即 show first++“,“++”show second+

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

  • (Show a)没有因使用“Show”而引起的实例 可能的解决方案: 将(显示a)添加到 以下项的类型签名: parse::Parser a->String->[(a,String)]
  • (++)的第一个参数中,即
    show first' 在
    (++)的第二个参数中,即
    
    show first++“,“++”show second++“]” 在
    (++)的第二个参数中,即
    
    “->[(“++显示第一个++”,“++显示第二个++”)”
我的问题:有没有一种方法可以显示有序对
(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
约束;然后,您将能够再次解析不可显示的内容。

如果
a
确实是不可显示的类型,该怎么办?要么添加
显示
约束,要么需要避免先打印
。不管怎样,
输入
第二个
后缀可能已经很好地代表了
第一个
。而不是
调试.跟踪
,我不知道有任何模块可以做到这一点(这将是一个非常棘手的实现过程,因为我们将不得不用很少的信息制作
Show
字典——类型不会在运行时存储)。但是您可能想签出。您的建议对我很有用…谢谢…
ghci my_script.hs…*Main>parse nextChar“ABCD”parse maps ABCD->[('A',“BCD”)[('A',“BCD”)]