2016-04-13 17 views
2

私はparseMessage関数を持っていて、ファイルのすべての行に適用して結果の配列を取得したいとします。どうやってやるの?Haskellでファイルの各行に関数を適用する方法

parseMessage :: String -> SpecificDataStructure 

type Path = String 
parseFile :: Path -> [SpecificDataStructure] 
parseFile what_do_I_need_here? 

答えて

0

あなたはこのような何かを探してされる可能性がありますに

parseFile = do 
    f <- readFile "myfile.txt" 
    map myFunc $ lines f 

linesString秒のリストにファイルを分割し、mapはあなたが(最初の引数で供給される)関数を適用することができますがリストの各要素結果は値のリストです。 (GHCi中の:t mapmap :: (a -> b) -> [a] -> [b]を生じる)。

0

まず、次にreadFileの

contents <- readFile "filename" 

を使用してファイルの内容を取得し、適切に機能

最後に
let fileLines = lines contents 

という名前の関数を使用して行にファイルを分割し、あなたの構造に各行を変換

let objects = map parseMessage fileLines 

これは、元のファイル。

5

まず、ファイルI/Oが関係するので、parseFileはIOモナドで動作する必要があることを認識する必要があります。これは、readFileによって生成されたIOアクションからコンテンツを抽出し、その結果をIOアクションにパッケージ化することを意味します。ここでは、IOアクションから、純粋な計算を分離し、2つの段階で最初のものです:

parseContents :: String -> [SpecificDataStructure] 
parseContents contents = map parseMessage (lines contents) 

parseFile :: String -> IO [SpecificDataStructure] 
parseFile fileName = readFile fileName >>= return . parseContents 

と、ここでは、1つの機能

parseFile :: String -> IO [SpecificDataStructure] 
parseFile fileName = do 
        contents <- readFile fileName 
        let parsed = map parseMessage (lines contents) 
        return parsed 
として書かれています
関連する問題