2014-11-04 54 views
1

我需要比较的Windows新行字符(“\ r \ n”),但我得到哈斯克尔换行符

lexical error in string/character literal at character '\\' 

['\r\n'] 

我怎样才能解决这个问题?

谢谢!

+0

为了澄清迄今为止​​收到的最佳答案:'\ r \ n'不是一个换行符 - 特别是,它不是一个字符。这是两个字符;所以你需要一个字符串文字(如上所述)。当然,你遇到的这个问题与Haskell无关。 – MasterMastic 2014-11-06 18:06:02

回答

7

编译器告诉你'\r\n'不是一个有效的字符。这应该不会令人意外,因为Windows使用两个字符来表示行结束。这意味着你需要一个String

"\r\n" 

这也意味着,分析输入的时候,你需要更复杂的分析。寻找两个字符的序列比寻找单个字符要困难一些。要解决

一种方法是与应用于每个String一个简单的过滤器可能包含"\r\n"删除所有'\r'字符:

deMicrosoftifyString = filter (/= '\r`) 
+0

令人失望,我不得不重写很多代码 – yonutix 2014-11-04 18:08:14

+4

@CosminMihai只是说,你会遇到任何语言的这个问题,它对于Haskell及其类型/库来说并不是唯一的。你可以责怪微软决定两个字符比一个更好,即使没有真正需要回车字符。 – bheklilr 2014-11-04 20:38:58

+0

@CosminMihai一个简单的解决方法是''过滤'每个'字符串'来删除''\ r''字符。它们基本上是不相关的,即使在现代版本的Windows中也是如此。大多数程序,无论操作系统如何,都会将'\ n'识别为换行符。 – 2014-11-04 23:13:11

8

注意,对于文件/在Windows默认的文本模式流,"\r\n"是输入时自动转换为"\n",反之亦然。

如果您有特殊需求,默认不处理,您可能希望查看System.IO.hSetNewlineMode函数,该函数允许您设置用于特定句柄的换行符转换。例如:

hSetNewlineMode handle universalNewlineMode 

设置一个把手来接受"\r\n""\n"作为输入新行(内部"\n"),但使用上输出的本机操作系统约定。

+0

+1肯定比我的回答更好,因为你给Haskell特定的方式来处理这个问题。 – 2014-11-05 03:43:40

+0

事实上,'\ n'和'\ r \ n'之间的转换甚至可以由C对Windows中以文本模式打开的文件执行。它是C标准的一部分,它确保您可以编写可移植的C语言,并且包括Haskell在内的许多语言都可以复制该特性。 – chi 2014-11-06 09:34:44