我正在努力理解Haskell的异步模型,并且在将已知的概念与Haskell的实现进行匹配时遇到了困难。
我有以下代码:
不确定为什么,但日志以以下顺序打印:
然后它才开始计算b的值。
我有点困惑,因为根据我的理解,
module Main where
import Control.Concurrent.Async (concurrently)
main :: IO ()
main = do
putStrLn "Hello, Haskell!"
(a, b) <- concurrently (pure $ myFibonaci 45) (pure $ myFibonaci 42)
print a
putStrLn "----"
print b
myFibonaci :: Integer -> Integer
myFibonaci 0 = 0
myFibonaci 1 = 1
myFibonaci n = myFibonaci (n - 1) + myFibonaci (n - 2)
不确定为什么,但日志以以下顺序打印:
267914296 -- value of a
----
然后它才开始计算b的值。
267914296
----
102334155 -- value of b
我有点困惑,因为根据我的理解,
concurrently
应该会生成两个绿色线程,然后可以映射到不同的系统线程并在不同的核心上执行。这意味着当我获取a
的值时,理论上b
的值应该已经计算出来了(如果没有调度延迟的话)。我正在使用-threaded
GHC选项运行代码,所以这不应该是问题。这是Haskell的惰性求值的问题吗?我怀疑更好的解决方案是使用Control.Parallel
,但是async
和Control.Parallel
之间有什么区别呢?我相当确定使用类似模型的Go语言没有这样的区别。
pure $! …
或evaluate
来强制执行它们。 - undefined