繁体   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