En Haskell me puede definir fácilmente una función recursiva que toma un valor y devuelve una cadena:recursiva IO en Haskell
Prelude> let countdown i = if (i > 0) then (show i) ++ countdown (i-1) else ""
Prelude> countdown 5
"54321"
Quiero usar el mismo tipo de diseño para leer los datos disponibles de un identificador de archivo. En este caso particular, necesito leer los datos de la misma manera que hGetContents, pero sin dejar el identificador en el estado "semicerrado", para que pueda iterar la interacción con los controladores stdin/stdout de un proceso abierto con 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 []
da el error:
Couldn't match expected type `IO b0' with actual type `[a0]'
In the expression: hGetLine h : hGetLines h
sé que hay varias bibliotecas disponibles para llevar a cabo lo que estoy tratando de lograr, pero SICE estoy aprendiendo mi pregunta es realmente cómo realizar recursiva IO. TIA!
Su código es algo extraño ... No incluso compilar . ¿Qué tal esto: 'si es legible entonces hGetLine >> = \ a -> hGetLine >> = \ b -> return $ a + b else return []'? Otro problema es que esto no se transmite. – fuz