このコードはどうですか:
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) を評価することを強制することは知っていますが、なぜそれが必要なのですか?
2 番目のプログラムを実行するとき、インターピーターは、nf1+nf2+1 式の nf1 を並行して評価しながら、nf2 を評価する新しいプロセスを起動しませんか? nf1 で始まる必要があることを指定するように指示する必要は何ですか?