2016-04-13 3 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 

lines раскалывает файл в список String с, и map позволяет применять функцию (поставляется в качестве первого аргумента), чтобы каждый элемент списка. Результатом является список значений. (:t map в GHCi дает map :: (a -> b) -> [a] -> [b]).

0

Во-первых, получить содержимое файла с помощью ReadFile

contents <- readFile "filename" 

Затем разбить файл на строки с помощью функции с соответствующим названием функцию

let fileLines = lines contents 

Наконец, преобразовать каждую строку в структуре

let objects = map parseMessage fileLines 

Это будет массив структур, представляющих исходный файл.

5

Во-первых, вы должны признать, что parseFile должен работать в монаде IO, поскольку он связан с файловыми вводами/выводами. Это означает извлечение содержимого из действия IO, созданного readFile, после чего упаковка результатов возвращается в действие IO. Здесь первый в два этапа, отделяя чистое вычисление от действий ввода-вывода:

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

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

и здесь написано, как одна функция

parseFile :: String -> IO [SpecificDataStructure] 
parseFile fileName = do 
        contents <- readFile fileName 
        let parsed = map parseMessage (lines contents) 
        return parsed 
Смежные вопросы