gpt4 book ai didi

haskell - 如何让Haskell程序响应用户输入显示初步结果?

转载 作者:行者123 更新时间:2023-12-02 15:47:45 27 4
gpt4 key购买 nike

我正在用 Haskell 编写一个程序,它会重复获取最新的结果并使用它来计算下一个结果。我希望能够看到响应用户输入的最新结果,所以我尝试了这样的操作:

main = mainhelper 0

mainhelper count = do
count <- return (count + 1)
line <- getLine
if null line
then do mainhelper count
else do
putStrLn $ show count
return ()

我希望如果用户没有输入任何内容,getLine 会返回一个空行,但这并没有发生,相反,程序在收到用户输入之前什么也不做。有办法解决这个问题吗?

最佳答案

一个简单的解决方案是 fork 一个线程来进行复杂的计算,并通过 MVar 与主 UI 线程进行通信。例如:

import Control.Exception
import Control.Monad
import Control.Concurrent

thinkReallyHard x = do
threadDelay 1000000 -- as a proxy for something that's actually difficult
evaluate (x+1)

main = do
v <- newMVar 0
forkIO (forever (modifyMVar_ v thinkReallyHard))
forever (getLine >> readMVar v >>= print)

您可能想知道 evaluatethinkReallyHard 中的作用。微妙之处在于 MVar 是惰性的——它们可以像计算值一样轻松地包含 thunk。特别是,这意味着很容易意外地将所有纯计算从 fork 线程推送到正在读取和使用 MVar 内容的线程中。对 evaluate 的调用只是强制 fork 线程在写入 MVar 之前完成纯计算。

关于haskell - 如何让Haskell程序响应用户输入显示初步结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275136/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com