繁体   English   中英

在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了以下错误的++ show first结果:

  • 没有使用(show a)产生(show a)的实例可能的解决方法:将(Show a)添加到以下类型的类型签名的上下文中:parse :: Parser a-> String-> [(a,String)]
  • (++)', namely的第一个参数中(++)', namely显示为首'在(++)', namely的第二个参数中(++)', namely显示为第一个++“,” ++显示第二个++“)]”' (++)', namely “-> [(“ ++显示第一个++”,“ ++显示第二个++”)]“''

我的问题:有没有办法显示有序对(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内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM