Вы используете newArray
, который имеет тип ST s (STArray s (Int, Int) Int)
. Однако вы используете его в теле функции main
, а это значит, что все, что вы do
, должно иметь тип IO
. ST
не IO
, поэтому типы не могут совпадать.
Сначала вы должны переместить newArray
в контекст, где у вас есть доступ к монаде ST
. Этот контекст, конечно же, доступен в теле runSTArray
, поэтому измените тело на:
runSTArray $ do
arr <- newArray ((0,0), (5,5)) 0 :: ST s (STArray s (Int, Int) Int)
par (writeArray arr (1,1) 17) (writeArray arr (2,2) 23)
return arr
Затем вам нужно переосмыслить поведение par
. par
предназначен для создания параллельных чистых вычислений и не может использоваться для монадических действий; монады вообще не могут быть распараллелены. В частности, монада ST
даже не предлагает никаких альтернатив для параллельных вычислений; поскольку параллельная запись в массив может привести к гонкам (что произойдет, если вы перезапишете одну и ту же ячейку? Какая запись будет учитываться, а какая нет?), здесь небезопасно допускать параллелизм. Вы должны изменить массив последовательно:
runSTArray $ do
arr <- newArray ((0,0), (5,5)) 0 :: ST s (STArray s (Int, Int) Int)
writeArray arr (1,1) 17
writeArray arr (2,2) 23
return arr
Однако запись не дорогая; это расчеты значений, которые могут быть дорогими. Предположим, вы хотите вычислить 17
и 23
на лету; затем вы можете сделать следующее:
let a = someLongCalculation 12534
b = a `par` (someLongCalculation 24889)
writeArray arr (1, 1) a
writeArray arr (2, 2) b
Наконец, вы должны понимать, что runSTArray
возвращает массив результатов, поэтому вы должны хранить его следующим образом:
import Control.Monad
import Control.Monad.ST
import Control.Parallel
import Data.Array.ST
main =
let pureArr =
runSTArray $ do
arr <- newArray ((0,0), (5,5)) 0 :: ST s (STArray s (Int, Int) Int)
writeArray arr (1,1) 17
writeArray arr (2,2) 23
return arr
in print pureArr
Я не думаю, что STArray
s здесь правильное решение. Вам следует использовать более мощную библиотеку массивов, такую как repa
, в ситуациях, когда вам нужны параллельные вычисления симметричных массивов.
person
dflemstr
schedule
09.04.2012