Как этот код:путаюсь о параллельном 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)
лучше, чем это:
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), но зачем это необходимо?
При выполнении второй программы, не будет ли интерпретатор испускать новый процесс для оценки nf2, одновременно оценивая nf1 выражения nf1 + nf2 + 1? Что нужно сказать, чтобы указать, что он должен начинаться с nf1?
Возможно, это будет 'pseq', а не' seq' (http://www.haskell.org/hoogle/?hoogle=pseq) – Matt