这看起来很简单,但出于某种原因我自己也很困惑。 “东西”行给了我错误 解析功能是正确的(从RWH中窃取)。我只是有一个类型错误。
谢谢!
import Text.ParserCombinators.Parsec
import System.IO
main = do
csv_cont <- openFile "aCSV.txt" ReadMode
csv_cont1 <- hGetContents csv_cont
thing <- parseCSV csv_cont1
return ()
csvFile = endBy line eol
line = sepBy cell (char ',')
cell = many (noneOf ",\n")
eol = char '\n'
parseCSV :: String -> Either ParseError [[String]]
parseCSV input = parse csvFile "(unknown)" input
答案 0 :(得分:3)
parseCSV
是一个纯函数(注意,类型中没有IO
)。因此,您不要使用“do notation”来绑定其结果。相反,只需定期let
:
import Text.ParserCombinators.Parsec
import System.IO
main = do
h <- openFile "aCSV.txt" ReadMode
s <- hGetContents h
let thing = parseCSV s
print thing
csvFile = endBy line eol
line = sepBy cell (char ',')
cell = many (noneOf ",\n")
eol = char '\n'
parseCSV :: String -> Either ParseError [[String]]
parseCSV s = parse csvFile "(unknown)" s
这里有更多惯用的命名和识别。