У меня есть функция, которая рекурсивно создает сплющенный список матриц из дерева, которые должны быть изменчивыми, поскольку их элементы часто обновляются во время их создания. До сих пор я придумал рекурсивное решение, имеющее подпись:
doAll :: .. -> [ST s (STArray s (Int, Int) Int)]
Причина, по которой я не возвращаю [UArray (Int,Int) Int]
напрямую, состоит в том, что doAll
вызывается рекурсивно, модифицирует элементы матриц в списке и добавляет новые матрицы. Я не хочу замораживать и оттаивать матрицы без необходимости.
Пока все хорошо. Я могу проверить n
-th матрицу (типа 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
) и как я мог оценить массивы в списке?