2014-11-04 52 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