В 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!