Haskell является функциональным и чистым, поэтому в основном он обладает всеми свойствами, необходимыми для компилятора для решения неявного parallelism.
Рассмотрим этот тривиальный пример:
f = do
a <- Just 1
b <- Just $ Just 2
-- ^ The above line does not utilize an `a` variable, so it can be safely
-- executed in parallel with the preceding line
c <- b
-- ^ The above line references a `b` variable, so it can only be executed
-- sequentially after it
return (a, c)
-- On the exit from a monad scope we wait for all computations to finish and
-- gather the results
Схематически план выполнения может быть описан как:
do
|
+---------+---------+
| |
a <- Just 1 b <- Just $ Just 2
| |
| c <- b
| |
+---------+---------+
|
return (a, c)
Почему в компиляторе нет такой функциональности с флагом или прагмой? Каковы практические причины?