簡體   English   中英

Haskell io-streams和“ forever”不會輸出到stdout

[英]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設置為LineBufferingNoBuffering來設置緩沖,但是仍然沒有輸出。 我試過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM