У меня есть функция, которая рекурсивно создает плоский список матриц из дерева, которые должны быть изменяемыми, так как их элементы часто обновляются во время их создания.До сих пор я придумал рекурсивное решение, которое имеет подпись:
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
) и как я могу оценить массивы в списке?