在 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' 而产生的 (Show a) 实例
可能的修复:
将 (Show a) 添加到上下文中
类型签名:
解析 :: 解析器 a -> 字符串 -> [(a, String)]
- 在
(++)', namely
的第一个参数中先显示'
在 (++)', namely
show first 的第二个参数中 ++ "," ++ show second ++ ")]"'
(++)', namely
的第二个参数" -> [(" ++ 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
约束;那么您将能够再次解析无法Show
的东西。
我在 Windows 7 和模块 Debug.Trace
上使用 GHC 8.0.2 版。
在下面的 parse
函数的跟踪中,我插入 ++ show first
导致以下错误:
- 没有因使用 `show' 而产生的 (Show a) 实例 可能的修复: 将 (Show a) 添加到上下文中 类型签名: 解析 :: 解析器 a -> 字符串 -> [(a, String)]
- 在
(++)', namely
的第一个参数中先显示' 在(++)', namely
show first 的第二个参数中 ++ "," ++ show second ++ ")]"'(++)', namely
的第二个参数" -> [(" ++ 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
约束;那么您将能够再次解析无法Show
的东西。