私はparseMessage
関数を持っていて、ファイルのすべての行に適用して結果の配列を取得したいとします。どうやってやるの?Haskellでファイルの各行に関数を適用する方法
parseMessage :: String -> SpecificDataStructure
type Path = String
parseFile :: Path -> [SpecificDataStructure]
parseFile what_do_I_need_here?
私はparseMessage
関数を持っていて、ファイルのすべての行に適用して結果の配列を取得したいとします。どうやってやるの?Haskellでファイルの各行に関数を適用する方法
parseMessage :: String -> SpecificDataStructure
type Path = String
parseFile :: Path -> [SpecificDataStructure]
parseFile what_do_I_need_here?
あなたはこのような何かを探してされる可能性がありますに
parseFile = do
f <- readFile "myfile.txt"
map myFunc $ lines f
lines
String
秒のリストにファイルを分割し、map
はあなたが(最初の引数で供給される)関数を適用することができますがリストの各要素結果は値のリストです。 (GHCi中の:t map
はmap :: (a -> b) -> [a] -> [b]
を生じる)。
まず、次にreadFileの
contents <- readFile "filename"
を使用してファイルの内容を取得し、適切に機能
最後にlet fileLines = lines contents
という名前の関数を使用して行にファイルを分割し、あなたの構造に各行を変換
let objects = map parseMessage fileLines
これは、元のファイル。
まず、ファイル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
として書かれています