Comment est-ce code:Am confus au sujet parallèle Haskell
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)
Mieux que cela:
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)
Je ne reçois pas les explications que j'ai trouvé en ligne qui disent « Afin de garantir que l'expression principale est évaluée dans le bon ordre (c'est-à-dire sans bloquer la tâche principale de la tâche enfant), l'annotation seq est utilisée ".
Pourquoi seq est-il utilisé? Je sais que ça oblige l'interprète à évaluer parfib (n-1) en premier mais pourquoi est-ce nécessaire?
Lors de l'exécution du second programme, l'interpéteur ne déclenchera-t-il pas un nouveau processus pour évaluer nf2, tout en évaluant nf1 de l'expression nf1 + nf2 + 1 en parallèle? Quel est le besoin de lui dire de spécifier qu'il devrait commencer par nf1?
Cela devrait probablement être 'pseq', pas' seq' (http://www.haskell.org/hoogle/?hoogle=pseq) – Matt