Tengo una función que toma un parámetro y produce un resultado. Desafortunadamente, lleva bastante tiempo para que la función produzca el resultado. La función se llama con bastante frecuencia con la misma entrada, por eso sería conveniente si pudiera almacenar en caché los resultados. Algo así comoResultados de caché de Haskell de una función
let cachedFunction = createCache slowFunction
in (cachedFunction 3.1) + (cachedFunction 4.2) + (cachedFunction 3.1)
que estaba investigando Data.Array y aunque la matriz es perezoso, se tiene que inicializar con una lista de pares (usando ListArray) - que es poco práctico. Si la 'clave' es, por ejemplo, el tipo 'Doble', no puedo inicializarlo en absoluto, e incluso si teóricamente puedo asignar un Entero a cada entrada posible, tengo varias decenas de miles de entradas posibles y solo uso un puñado. Tendría que inicializar la matriz (o, preferiblemente, una tabla hash, ya que solo se usarán un puñado de resutls) utilizando una función en lugar de una lista.
Actualización: Estoy leyendo los artículos de memorización y, por lo que yo entiendo, la MemoTrie podría funcionar de la manera que quiero. Tal vez. ¿Podría alguien tratar de producir la 'función en caché'? Preferiblemente para una función lenta que toma 2 argumentos dobles? ¿O, alternativamente, eso toma un argumento Int en un dominio de ~ [0.100 millones] que no se comerá toda la memoria?
1 de memoization – Macke
El dominio clave es de aproximadamente 1,8 mil millones. No tengo forma de inicializar ninguna estructura de datos ya que esto consumiría toda mi memoria disponible. – ondra
Es por eso que la idea es la inicialización * perezosa *; teóricamente, la estructura de datos contiene todo el espacio clave, pero la evaluación no estricta permite que solo se inicialicen las partes que realmente usa. Es la misma idea que las listas infinitas, excepto que necesitará algo que evite el cruce lineal. –