2016-04-13 34 views
2
dosyanın her satırında bazı işlevi nasıl uygulanır

ı bir parseMessage işlevi var diyelim ve bunu dosyanın her satırı için geçerli ve sonuçların dizi almak istiyorum. Bunu nasıl yapabilirim?Haskell

parseMessage :: String -> SpecificDataStructure 

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

cevap

0

Böyle bir şey yapmak isteyen olabilir:

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

linesString s'lik bir listeye dosyayı böler ve map size (ilk argüman verilen) bir işlevi uygulamak sağlar listenin her elemanı. Sonuç, bir değerler listesidir. (GHCi içinde :t map, map :: (a -> b) -> [a] -> [b] verir).

0

Öncelikle Sonra

contents <- readFile "filename" 

Readfile

kullanarak dosyanın içeriğini alın, yapının

her satırı dönüştürmek, uygun

let fileLines = lines contents 

Son olarak fonksiyonunu adlı işlevini kullanarak çizgileri halinde dosya bölme

let objects = map parseMessage fileLines 

Bu temsil yapılar dizisi olacak Orijinal dosya. dosya I/O içerdiğinden

5

İlk olarak, parseFile IO monad çalışmasına sahip olduğunu tanımak zorunda. Bu, daha sonra bir IO Geri harekete sonuçları ambalajlar readFile üretilen IO eylem içeriğini çıkarma anlamına gelir. İşte IO eylemler saf hesaplama ayıran iki adımda ilk:

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

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

ve burada bir fonksiyonu olarak yazılır

parseFile :: String -> IO [SpecificDataStructure] 
parseFile fileName = do 
        contents <- readFile fileName 
        let parsed = map parseMessage (lines contents) 
        return parsed