我在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.
答案 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}}