在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