map runSTArray over a list of STArrays?

У меня есть функция, которая создает рекурсивно уплощенный список матриц из дерева, которые должны быть мутабельными, так как их элементы часто обновляются во время их создания. Пока что я придумал рекурсивное решение, которое имеет такую подпись:

doAll :: .. -> [ST s (STArray s (Int, Int) Int)]

Причина, по которой я не возвращаю [UArray (Int,Int) Int] напрямую, заключается в том, что doAll вызывается рекурсивно, изменяет элементы матриц в списке и добавляет новые матрицы. Я не хочу без необходимости замораживать и размораживать матрицы.

Пока все хорошо. Я могу проверить n-ю матрицу (типа Array (Int, Int) Int) в ghci

runSTArray (matrices !! 0)
runSTArray (matrices !! 1)

и действительно получаю правильные результаты для моего алгоритма. Однако я не нашел способа отобразить runSTUArray на список, возвращаемый doAll:

map (runSTArray) matrices

Couldn't match expected type `forall s. ST s (STArray s i0 e0)'
            with actual type `ST s0 (STArray s0 (Int, Int) Int)'

Та же проблема возникает, если я пытаюсь оценить рекурсивно список или пытаюсь оценить отдельные элементы, обернутые в функцию

Может кто-нибудь объяснить, что происходит (я не очень понял последствия ключевого слова forall) и как я могу оценить массивы в списке?

11
задан hammar 28 November 2011 в 18:01
поделиться