Рекурсивный ввод-вывод в Haskell

В Haskell я могу легко определить рекурсивную функцию, которая принимает значение и возвращает строку:

Prelude> let countdown i = if (i > 0) then (show i) ++ countdown (i-1) else ""
Prelude> countdown 5
"54321"

Я хочу использовать такой же дизайн для чтения доступных данных из дескриптора файла. В этом конкретном случае мне нужно прочитать данные так же, как и hGetContents, но не оставляя дескриптор в «полузакрытом» состоянии, чтобы я мог зацикливать взаимодействие с дескрипторами stdin / stdout процесса, открытого с помощью createProcess:

main = do
    -- do work to get hin / hout handles for subprocess input / output

    hPutStrLn hin "whats up?"

    -- works
    -- putStrLn =<< hGetContents hout

    putStrLn =<< hGetLines hout

    where
        hGetLines h = do
            readable <- hIsReadable h
            if readable
                then hGetLine h ++ hGetLines h
                else []

Выдает ошибку:

Couldn't match expected type `IO b0' with actual type `[a0]'
In the expression: hGetLine h : hGetLines h

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

5
задан Don Stewart 24 May 2011 в 17:34
поделиться