Tengo una pregunta acerca de cómo implementar el almacenamiento en caché (memoialización) usando matrices en Haskell. El siguiente patrón funciona:Definición de función Haskell y matrices de almacenamiento en caché
f = (fA !)
where fA = listArray...
Pero esto no lo hace (la velocidad del programa sugiere que la matriz se está recreada cada llamada o algo así):
f n = (fA ! n)
where fA = listArray...
Definición fA exterior de una cláusula where (en "alcance global") también funciona con cualquiera de los patrones.
Tenía la esperanza de que alguien pudiera indicarme una explicación técnica de cuál es la diferencia entre los dos patrones anteriores.
Tenga en cuenta que estoy usando el último GHC, y no estoy seguro de si esto es solo una peculiaridad del compilador o parte del lenguaje en sí.
EDIT:! se utiliza para el acceso a la matriz, entonces fA! 5 significa fA [5] en sintaxis de C++. Mi comprensión de Haskell es que (fA!) N sería lo mismo que (fA! N) ... también hubiera sido más convencional para mí haber escrito "f n = fA! N" (sin los paréntesis). De todos modos, obtengo el mismo comportamiento sin importar cómo hago entre paréntesis.
Se ha publicado una pregunta similar aquí: http://stackoverflow.com/questions/3951012/when-is-memoization-automatic-in-ghc-haskell - aunque un poco más claramente indicado, y con algunas buenas respuestas. –