[英]Haskell io-streams and `forever` produces no output to stdout
如果我運行此程序,則沒有輸出到stdout
:
import Control.Monad (forever)
import qualified System.IO.Streams as S
import System.Random (randomRIO)
main :: IO ()
main = do
is <- S.makeInputStream $ forever $ (randomRIO (1, 100) :: IO Int)
os <- printStream =<< S.read is
return ()
printStream :: Maybe Int -> IO ()
printStream Nothing = putStrLn "Nada!"
printStream (Just a) = putStrLn $ show a
我嘗試將System.IO.hSetBuffering
設置為LineBuffering
和NoBuffering
來設置緩沖,但是仍然沒有輸出。 我試過cat | ~/local/bin/program | cat
cat | ~/local/bin/program | cat
cat | ~/local/bin/program | cat
但再次,在標准輸出中什么也沒有。
代碼中forever
的含義是forever
需要選擇流中的每個值。 它的類型
forever :: Monad m => m a -> m b
是同樣的計算建立了一個大線索forever
永遠沒有返回值:調用者forever
得挑類型b
隨意,所以沒有程序實際上可以承諾提供該類型的值。 這也是您的程序進行類型檢查的原因。 forever
傳遞給您的計算會forever
有效(在這種情況下,選擇一個隨機數),但是不會傳遞任何值,因此流永遠不會消失。
您不需要forever
就可以使源源不斷的流。 makeInputStream
的行為是每次在流中需要一個值時都運行其參數計算,因此您已經在其中進行了重復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.