Haskell跟踪功能

时间:2015-02-24 20:48:29

标签: haskell recursion trace

我在Mac上,我通过命令行运行Haskell。这是我的代码我递归地反转列表。

import Debug.Trace
reverse1 :: (Show a) => [a] -> [a]  
reverse1 [] = []  
reverse1 (x:xs) = trace(“input xs: “ ++ show xs) $ reverse1 xs ++ [x]

赋值是递归执行并显示跟踪。如果我在添加跟踪信息后删除跟踪信息,它就会反过来。这是我收到的错误。

[1 of 1] Compiling Main             ( reverse.hs, interpreted )

reverse.hs:4:24: lexical error at character '\8220'
Failed, modules loaded: none. 

1 个答案:

答案 0 :(得分:7)

您有一个复制和粘贴问题:您的代码段使用花哨的引号()而不是普通的引号("),而Haskell不知道如何解析它。

在错误消息中,“词法错误”表示您的语法有问题;具体来说,它不知道如何处理'\8220'的字符putStrLn

假设您的控制台正确支持Unicode,您可以看到这样的转义码与Prelude GHC.Exts> putStrLn "\8220" “ 对应的字符:

C-x 8 <RET>

这可能有助于您将来了解类似的错误消息。

如果您在Emacs中,另一个选项是使用命令8220,它允许您按编号输入Unicode字符(在这种情况下为C-x 8 <RET> #10r8220 “ )。不幸的是,Emacs期望一个十六进制的数字,而Haskell提供一个基数为10的数字,所以你必须明确你的基数:

{{1}}