在Haskell中提取格式化文本文件中的最大数字

时间:2012-07-17 21:34:18

标签: parsing haskell max parsec

好吧,我不确定Haskell是否有直接的方法,但这是我的困境。

假设我有一个包含以下内容的文本文件:

map z [1,2,3,4,5,6,7] Z
test x [1,2,3] X
map y [1,2,3,4,5] Y
map q [1...4] Q

我需要做的是找到地图“列表”中包含的最大值。例如,在上面的例子中,任何地图的最高值是7。 它们通常格式为

map _ [] _

所以我只需要在这个例子中找到地图所拥有的最大值。有没有直接的方法呢?

感谢。

2 个答案:

答案 0 :(得分:3)

我的攻击计划是这样的:

  1. 坐下来仔细写出我愿意接受的格式的语法。
  2. 创建一个ADT,它可以存储所有(且唯一的)成功解析该格式的信息。
  3. 编写Parsec解析器。如果你已经完成了前两个步骤,这应该是一个很好的,尽管你需要了解一下Parsec。
  4. 编写一个处理步骤2中设计的ADT的函数,并提取感兴趣的统计数据。
  5. 将第3步和第4步的结果联系起来;通常,这是最乏味和最无趣的部分,但它需要完成。 =)
  6. 让我们知道在你遇到问题之前你在列表中走了多远,我们可以提供一些更有针对性的建议。

答案 1 :(得分:1)

如果你的文件格式有点简单,你可以这样写:

process :: String -> String                                                    
process input = show . maximum $ map (maximum . readMapLine) goodLines         
        where                                                                  
            isGood line = head (words line) == "map"                           
            goodLines = filter isGood (lines input)                            
            readMapLine line = read ((words line) !! 2) :: [Integer]           


main :: IO ()                                                                  
main = do                                                                      
          input <- getContents                                                 
          print $ process input   

我省略了所有错误检查,我的解决方案无法read文件[1...4]中的最后一个列表:我认为它应该丢弃它。但你有了主意;-)