Par函数底层逻辑

dev*_*223 6 parallel-processing haskell

par功能如何运作?它的签名是:

par :: a -> b -> b.
Run Code Online (Sandbox Code Playgroud)

但这很奇怪.为什么不呢:

par :: (a -> b) -> a -> b

(获取函数,在新线程中执行它并返回结果)?

另一个问题,这是正常的haskell多线程吗?

在此输入图像描述

Don*_*art 10

par 是投机性的并行性,依赖于懒惰.

您推测a在您忙于工作时应计算未评估的值b.

稍后在您的程序中,您可能会a再次参考,它将准备就绪.

这是一个例子.我们希望将3个数字加在一起.每个数字的计算成本都很高.我们可以并行计算它们,然后将它们加在一起:

main = a `par` b `par` c `pseq` print (a + b + c)
    where
        a = ack 3 10
        b = fac 42
        c = fib 34

fac 0 = 1
fac n = n * fac (n-1)

ack 0 n = n+1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))

fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
Run Code Online (Sandbox Code Playgroud)