在Haskell,我可以很容易地定义一个递归函数,它接受一个值,并返回一个字符串:递归IO在Haskell
Prelude> let countdown i = if (i > 0) then (show i) ++ countdown (i-1) else ""
Prelude> countdown 5
"54321"
我想用同一种设计,从文件句柄读取可用的数据。在这种特殊情况下,我需要以与hGetContents相同的方式读取数据,但不要将句柄置于“半闭合”状态,以便可以使用createProcess打开的进程的stdin/stdout句柄循环交互:
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
我知道有可用于完成我想要完成各种库,但SICE我学习,我的问题是如何真正执行递归IO。 TIA!
你的代码是有些奇怪......它甚至没有编译。那么如何:'如果可读然后hGetLine >> = \ a - > hGetLine >> = \ b - >返回$ a + b else返回[]'?另一个问题是,这不是流。 – fuz 2011-05-24 16:32:48