2017-07-10 20 views
2

私はHaskellを初めて使用しています。同時I/Oがどのように機能するのかよく分かりません。私はJACKオーディオバインディングで何が達成できるのかを探っています。 、Haskell - 並行I/Oルーティング

Input | Result   | Output 
---------------------------------------- 

330 | Frequency changes | ">> 330.0" 
440 | Nothing happens | "" 
220.0 | Frequency changes | ">> 220.0" 
550.0 | Nothing happens | "" 
bleh | Outputs "Nada"  | ">> Nada" 
     | Nothing Happens | "" 
foo | Outputs "Nada"  | ">> Nada" 

私はよく分からない:基本的には、次のコードは(ほとんど)機能であるが、私は、入力値二倍たびにEnterキーを押す必要があります。問題を明確にするために

collectInput :: IORef Double -> IO() 
collectInput freq = forever $ do 
     putStr ">> " 
     hFlush stdout 
     f <- getLine 
     case readMaybe f of 
      Just x -> do 
       putStrLn $ show x 
       writeIORef freq x 
      Nothing -> do 
       putStrLn "Nada" 


main :: IO() 
main = do 
    freq <- newIORef 440 
    _ <- forkIO $ runJackStuff freq 
    collectInput freq 

をIOストリームはスレッドを通じて循環されるように見えます。他のすべての行ではなく、入力行ごとにプログラムを読み込ませる方法はありますか?

+1

問題を再現できません。 MCVEを作成することを検討してください。これにはインポートが含まれ、 'runAudioStuff'が除外され、サンプルをテストして、それが正しく動作しないようにしてください。私のバージョンはうまく動作します。もしあなたのものがそうでなければ、それはあなたの端末の問題であり、Haskellの問題ではないと思われます。 –

答えて

0

実装は常に重要です。それはrunJackは定義がありSound.JACK、中waitForBreakと呼ばれることが判明:

waitForBreak :: IO() 
waitForBreak = 
    let go = getLine >> go 
    in go 

collectInputを使用してその場所に問題を解決しました。

関連する問題