[英]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.