1

好吧,我不确定在 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 _ [] _

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

谢谢。

4

2 回答 2

3

我的攻击计划是这样的:

  1. 坐下来仔细写出我愿意接受的格式的语法。
  2. 创建一个 ADT,它可以存储从成功解析该格式获得的所有(且仅)可用信息。
  3. 编写 Parsec 解析器。如果您已经完成了前两个步骤,这应该是小菜一碟,尽管您需要了解一点 Parsec。
  4. 编写一个函数来处理步骤 2 中设计的 ADT 并提取感兴趣的统计信息。
  5. 将第 3 步和第 4 步的结果汇总在一起;通常,这是最乏味和无趣的部分,但需要完成。=)

让我们知道您在卡住之前将其排到了多远,我们可以提供一些更有针对性的建议。

于 2012-07-17T22:08:03.907 回答
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]:我认为它应该只是丢弃它。但你明白了;-)

于 2012-07-18T14:06:13.630 回答