2016-08-02 10 views
2

an stdout Wenn ich dieses Programm ausführen, bekomme ich keine Ausgabe zu stdout:Haskell io-Streams und `forever` erzeugt keine Ausgabe

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 

Ich habe versucht, Pufferung Einstellung mit System.IO.hSetBuffering-LineBuffering und NoBuffering aber noch keine Ausgabe. Ich habe versucht cat | ~/local/bin/program | cat aber wieder nichts in stdout.

Antwort

6

Die Bedeutung der forever in Ihrem Code ist, dass es für immer jeder Wert im Stream zu wählen ist. Seine Art

forever :: Monad m => m a -> m b 

ist ein großer Hinweis, dass eine mit forever gebaut Berechnung nie einen Wert zurückgibt: der Anrufer von forever bekommt b willkürlich die Art zu wählen, so kann kein Programm verspricht tatsächlich einen Wert dieses Typs zu liefern. Das ist auch der Grund, warum Ihr Programm prüft. Die Berechnung, die Sie an forever übergeben, wird wiederholt für ihren Effekt ausgeführt (in diesem Fall wird eine Zufallszahl gewählt), aber es wird niemals ein Wert geliefert, daher wird der Stream niemals ausgeführt.

Sie sollten keinen forever benötigen, um einen Strom zu erzeugen, der weiter läuft. Das Verhalten von makeInputStream besteht darin, die Argumentberechnung jedes Mal auszuführen, wenn ein Wert aus dem Stream angefordert wird, sodass Sie Ihre Wiederholung bereits dort haben.

+0

Vielen Dank! Ich habe "für immer" als eine Art Transformation gelesen, so dass es in diesem Fall ein "IO Int" zurückgibt, von dem ich dann einen Wert ziehen kann. Ich habe diesen Aufruf in die Ausgabe-Stream-Zeile verschoben und es funktioniert wie vorgesehen! :) –

+1

Ich habe gesagt, dass sie es ändern sollten für immer :: Monad m => m() -> m Void'! – Gurkenglas

+0

"Sie können reden, bis Sie im Gesicht blau sind ..." – pigworker