Tengo una función que crea recursivamente una lista aplanada de matrices de un árbol que tienen que ser mutables ya que sus elementos se actualizan con frecuencia durante su creación. Hasta ahora he llegado a una solución recursiva que tiene la firma:map runSTArray sobre una lista de STArrays?
doAll :: .. -> [ST s (STArray s (Int, Int) Int)]
La razón por la que no devuelva el [UArray (Int,Int) Int]
directamente es porque doAll
se llama de forma recursiva, modifica los elementos de las matrices en la lista y añade nuevas matrices . No quiero congelar y descongelar las matrices innecesariamente.
Hasta ahora todo bien. Puedo inspeccionar la matriz -ésimo n
(de tipo Array (Int, Int) Int
) en ghci
runSTArray (matrices !! 0)
runSTArray (matrices !! 1)
y de hecho puedo obtener los resultados correctos para mi algoritmo. Sin embargo, no he encontrado una manera de asignar runSTUArray
sobre la lista que se devuelve por 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)'
El mismo problema ocurre si se intenta evaluar de forma recursiva sobre la lista o tratar de evaluar los elementos individuales envueltos en una función
¿Podría alguien explicar qué está pasando (no entendí realmente las implicaciones de la palabra clave forall
) y cómo podría evaluar las matrices en la lista?
http://www.mail-archive.com/[email protected]/msg47957.html –