Ho una funzione che crea in modo ricorsivo una lista appiattita di matrici da un albero che deve essere mutabile poiché i loro elementi vengono aggiornati spesso durante la loro creazione. Finora sono venuto su con una soluzione ricorsiva che ha la firma:map runSTArray su un elenco di STArray?
doAll :: .. -> [ST s (STArray s (Int, Int) Int)]
Il motivo per cui non ritorno il [UArray (Int,Int) Int]
direttamente è perché doAll
si chiama in modo ricorsivo, modifica elementi delle matrici in lista e aggiunge nuove matrici . Non voglio congelare e scongelare inutilmente le matrici.
Fin qui tutto bene. Posso ispezionare il n
matrice -esimo (di tipo Array (Int, Int) Int
) in ghci
runSTArray (matrices !! 0)
runSTArray (matrices !! 1)
e in effetti io ottenere i risultati corretti per il mio algoritmo. Tuttavia, non ho trovato un modo per mappare runSTUArray
sopra la lista che viene restituito dal 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)'
Lo stesso problema si verifica se provo a valutare in modo ricorsivo oltre l'elenco o cercare di valutare i singoli elementi avvolti in un funzione
Qualcuno potrebbe spiegare cosa sta succedendo (non ho veramente capito le implicazioni della parola chiave forall
) e come è stato possibile valutare gli array nell'elenco?
http://www.mail-archive.com/[email protected]/msg47957.html –