我有以下代码:
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"
型
你知道我错过了什么吗
2条答案
按热度按时间tyky79it1#
问题似乎是你期待一个换行符,但你的文本不包含一个。将
eol
改为字符串
一定会成功的
fwzugrvs2#
“\n”是Haskell(和C等)字符串和字符字面量中用于表示ASCII 0x 0A的转义码,该字符用于指示UNIX和类UNIX平台上的行尾。您通常不会使用键盘上的<>或键将此字符放入文件(例如),而是使用键。
在PC-DOS和DOS类系统上,ASCII 0x 0 D后跟ASCII 0x 0A用于行尾,“\r”是ASCII 0x 0 D的转义码。
getLine会一直读取,直到找到行尾,并返回一个包含行尾字符以外的所有字符的字符串。因此,在您的示例中,解析器将无法匹配。您可以通过可选地匹配行尾来修复此问题。