在Haskell中进行跟踪时,如何“显示”编译时数据类型未知的值?
我在Windows 7上使用GHC 8.0.2版,&module在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+
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”)]