2015-02-24 109 views
0

我在一个mac上,我通过命令行运行Haskell。这是我递归倒序列表的代码。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. 
+2

''“ - 这恰恰是 – 2015-02-24 20:51:02

+0

没有'-XUnicodeSyntax'帮助...哦,好吧,显然它没有。也许有人应该要求它... – MathematicalOrchid 2015-02-25 09:30:37

回答

7

你有一个复制和粘贴的问题:你的代码段使用花哨的报价(),而不是常年偏多(")和Haskell不知道如何分析它。

在错误消息中,“词法错误”意味着您的语法存在问题;具体而言,它不知道如何处理'\8220'这是的ASCII表示。

假设你的控制台正确支持Unicode,你可以看到什么人物像这样的转义码对应于具有putStrLn

Prelude GHC.Exts> putStrLn "\8220" 
“ 

这可以帮助你了解今后发生类似的错误消息。

如果您在Emacs中,另一种选择是使用命令C-x 8 <RET>,该命令允许您通过编号输入一个Unicode字符(在这种情况下为8220)。不幸的是,Emacs的预计十六进制数和Haskell提供了一个以10为基数的,所以你必须要明确你的基数:由于您使用Unicode双引号,而不是普通

C-x 8 <RET> #10r8220 
“ 
+0

好吧我如何得到正常的。每当我添加他们像这样自动添加它们,我该如何改变它? – 2015-02-24 21:29:51

+2

@ChelseaCarl:这听起来像是你的编辑器或操作系统设置的问题,我不一定能帮你解决这个问题,所以我建议你再问一个关于[Super用户](http://superuser.com/),了解如何输入普通报价,包括编辑器,操作系统和问题细节中的键盘布局。 – 2015-02-24 21:38:05