我对Haskell非常陌生,我正试图解析一个地图文件,只是为了练习。我的代码会编译,但是它给了我错误的结果。我所得到的只是“正确[]”--我不明白。
我的代码非常类似于教程这里,但我重写了它以满足我的需要。
我的文件如下所示(为了节省空间,我删除了大部分行):
#test map 2
0,0:1;
1,0:1;
2,0:1;
3,0:1;我的代码:
import Data.Word
import Data.Time
import Data.Attoparsec.Char8
import Control.Applicative
import qualified Data.ByteString as B
-- Types --
data Tile = Tile Int Int Int deriving Show
data MapLine =
MapLine { tile :: Tile } deriving Show
-- Parsing --
parseTile :: Parser Tile
parseTile = do
x <- decimal
char ','
y <- decimal
char ':'
t <- decimal
char ';'
return $ Tile x y t
mapLineParser :: Parser MapLine
mapLineParser = do
t <- parseTile
return $ MapLine t
fileParser :: Parser [MapLine]
fileParser = many $ mapLineParser <* endOfLine
-- Main --
main :: IO()
--main = B.readFile "map.hexmap" >>= print . parseOnly fileParser
main = do
print "Parsing map..."
let x = B.readFile "map.hexmap"
x >>= print . parseOnly fileParser
print "Done."谢谢你的帮助。
发布于 2014-12-06 13:48:27
在第一行失败之前,解析器“成功地解析”了长度为零的MapLines列表。删除这一行(并确保您的文件在开始时不包括任何不可解析的字节,就像BOM一样),它应该可以工作。或者为从忽略结果的#开始的行编写解析器,然后组合。
https://stackoverflow.com/questions/27331984
复制相似问题