这段代码如何:
parfib :: Int -> Int
parfib 0 = 1
parfib 1 = 1
parfib n = nf2 `par` (nf1 `par` (nf1+nf2+1))
where nf1 = parfib (n-1)
nf2 = parfib (n-2)
比这更好:
parfib :: Int -> Int
parfib 0 = 1
parfib 1 = 1
parfib n = nf2 `par` (nf1 `seq` (nf1+nf2+1))
where nf1 = parfib (n-1)
nf2 = parfib (n-2)
我没有得到我在网上找到的解释说“为了保证以正确的顺序评估主表达式(即不阻塞子任务上的主任务),使用了 seq 注释”。
为什么要使用 seq?我知道它强制解释器首先评估 parfib (n-1) 但为什么有必要?
在执行第二个程序时,interpeter 不会触发一个新进程来评估 nf2,同时并行评估 nf1+nf2+1 表达式的 nf1 吗?有什么需要告诉它指定它应该以 nf1 开头?