从openFile内容中解析

时间:2011-06-11 23:17:03

标签: haskell syntax

这看起来很简单,但出于某种原因我自己也很困惑。 “东西”行给了我错误 解析功能是正确的(从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

1 个答案:

答案 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

这里有更多惯用的命名和识别。