Haskell -- 并发 I/O 路由
Posted
技术标签:
【中文标题】Haskell -- 并发 I/O 路由【英文标题】:Haskell -- Concurrent I/O Routing 【发布时间】:2017-12-13 15:51:09 【问题描述】:我是 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 流似乎是通过线程循环的。有没有办法让程序读取每一行输入,而不是每隔一行?
【问题讨论】:
我无法重现您的问题。请考虑制作一个 MCVE,这将包括导入,排除runAudiostuff
,并包括您测试示例以确保它仍然运行不正确。我的版本运行良好 - 如果您的版本没有,那么我怀疑这是您的终端问题,而不是 Haskell 问题。
【参考方案1】:
实施总是很重要。原来runJack
在Sound.JACK中调用了waitForBreak
,其定义如下:
waitForBreak :: IO ()
waitForBreak =
let go = getLine >> go
in go
使用collectInput
代替它解决了这个问题。
【讨论】:
以上是关于Haskell -- 并发 I/O 路由的主要内容,如果未能解决你的问题,请参考以下文章
Haskell:未经请求的unicode字符在i / o中转义