2016-06-27 3 views
1

Я написал этот код, который проходит через строки дескриптора файла и выполняет с ним произвольное действие. Я не думаю, что это должно быть рекурсивным - могу ли я превратить его в фолд-действие?Поверните рекурсию в складку?

Спасибо!

processHandle :: Handle -> (String->IO()) -> IO() 
processHandle h fn = do 
        eof <- hIsEOF h 
        if eof then 
        return() 
        else do 
         myLine <- hGetLine h 
         fn myLine 
         processHandle h fn 
+0

Я думаю, вы только что написали фальцевальное действие, которое вы ищете! Фактически нет фактической складки, потому что у вас нет фактического контейнера, полного значений, а скорее дескриптор, который позволяет использовать ввод-вывод для получения значений. – dfeuer

ответ

6

Ручная работа с ручками очень небезопасна в Haskell. Он плохо сочетается с функциональным стилем программирования.

Для простого ввода процессора, как это, это, наверное, лучше просто прочитать весь файл как один (ленивый) строки и обрабатывать строки, которые:

processHandle h fn = mapM_ fn . lines =<< hgetContents h 

Конечно, это также может напишите как сгиб, просто посмотрите вверх the definition of mapM_.

Теперь этот подход с ленивым IO не подходит для многих серьезных приложений. Если это не один огромный файл, тогда вам может быть хорошо, если вы просто прочитаете файл строго with the Data.Text equivalent. Иначе, если вам действительно нужно прочитать строки, чередующиеся с шагами обработки, лучше взгляните на conduit.

+0

О, умный. Благодарю. – Carbon

Смежные вопросы