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パーサーを作成します。前の2つの手順を実行した場合、これは簡単なことですが、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 に答える