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