首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基本Attoparsec解析只返回"Right []“

基本Attoparsec解析只返回"Right []“
EN

Stack Overflow用户
提问于 2014-12-06 13:04:38
回答 1查看 104关注 0票数 1

我对Haskell非常陌生,我正试图解析一个地图文件,只是为了练习。我的代码会编译,但是它给了我错误的结果。我所得到的只是“正确[]”--我不明白。

我的代码非常类似于教程这里,但我重写了它以满足我的需要。

我的文件如下所示(为了节省空间,我删除了大部分行):

代码语言:javascript
复制
#test map 2
0,0:1;
1,0:1;
2,0:1;
3,0:1;

我的代码:

代码语言:javascript
复制
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."

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-06 13:48:27

在第一行失败之前,解析器“成功地解析”了长度为零的MapLines列表。删除这一行(并确保您的文件在开始时不包括任何不可解析的字节,就像BOM一样),它应该可以工作。或者为从忽略结果的#开始的行编写解析器,然后组合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27331984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档