我有以下代码:
import Text.ParserCombinators.Parsec
import Control.Applicative hiding ((<|>))
import Control.Monad
data Test = Test Integer Integer deriving Show
integer :: Parser Integer
integer = rd <$> many1 digit
where rd = read :: String -> Integer
testParser :: Parser Test
testParser = do
a <- integer
char ','
b <- integer
eol
return $ Test a b
eol :: Parser Char
eol = char '\n'
main = forever $ do putStrLn "Enter the value you need to parse: "
input <- getLine
parseTest testParser input
但是当我真正尝试在ghci
中解析我的价值时,它却无法运作。
ghci > main
Enter the value you need to parse:
34,343\n
parse error at (line 1, column 7):
unexpected "\\"
expecting digit or "\n"
关于我在这里缺少什么的想法?
答案 0 :(得分:3)
问题似乎是您期望换行,但您的文字不包含换行符。将eol
更改为
eol :: Parser ()
eol = void (char '\n') <|> eof
它会起作用。
答案 1 :(得分:1)
“\ n”是Haskell(和C等)字符串和字符文字中使用的转义码,用于表示ASCII 0x0A,该字符用于表示UNIX和类UNIX平台上的行尾。你没有(通常)使用&lt; \&gt;或&lt; n&gt;键盘上的键将此字符放入文件(例如),而不是使用&lt; Enter&gt;键。
在PC-DOS和类似DOS的系统上,ASCII 0x0D后跟ASCII 0x0A用于行尾,“\ r”是用于ASCII 0x0D的转义码。
getLine读取,直到找到行尾并返回包含除行尾字符之外的所有内容的字符串。因此,在您的示例中,您的解析器将无法匹配。您可以通过选择匹配行尾来解决此问题。