【问题标题】:Haskell -- Concurrent I/O RoutingHaskell -- 并发 I/O 路由
【发布时间】: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 问题。

标签: haskell io routing jack


【解决方案1】:

实施总是很重要。原来runJack在Sound.JACK中调用了waitForBreak,其定义如下:

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

使用collectInput 代替它解决了这个问题。

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 2013-06-04
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多