Haskell——并发 I/O 路由



我是 Haskell 的新手,我不确定并发 I/O 是如何工作的。 我正在探索使用 JACK 音频绑定可以实现什么。 基本上,以下代码(几乎(是功能性的,但是每次输入值时都需要按两次回车键:

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

要澄清问题:

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"

我不确定,但似乎 IO 流是通过线程循环的。 有没有办法让程序读取每一行输入,而不是每隔一行?

实现总是很重要。 事实证明,runJack在Sound.JACK中称为waitForBreak,其定义是:

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

在其位置使用collectInput解决了问题。

最新更新