Imagine que necesita doblar una secuencia, y desea conocer también los valores intermedios en varios puntos a lo largo del rango. Esto es lo que he usado para esto:¿Qué es este patrón de plegado e iteración?
[a,b,c] = map fst . tail $ chain [g i, g j, g k] (zero, sequence)
g :: Integer -> (a,b) -> (a,b)
chain (f:fs) x = x : chain fs (f x)
chain [] x = [x]
La función g
consume una porción específica de una secuencia de entrada (de longitud i
, j
, etc.), comenzando con un valor inicial y producir resultados de la misma tipo, para ser alimentado en la próxima invocación. El consumo de la secuencia varias veces para diferentes longitudes comenzando desde el principio y el mismo valor inicial sería ineficiente, tanto en el tiempo como en el espacio, por supuesto.
Por lo tanto, por un lado, doblamos esta secuencia de enteros: puntos provisionales en la secuencia; por otro lado iteramos esta función, g
. ¿Qué es? ¿Me estoy perdiendo algo básico aquí? ¿Puede esto expresarse de alguna manera con el repertorio regular de pliegues, etc.?
EDIT: Resuelto: lo anterior es simplemente
[a,b,c] = map fst . tail $ scanl (flip g) (zero, sequence) [i, j, k]
interesante cómo una iteración modificable en realidad es plegado de la lista de modificadores.
¿Básicamente significa scanl? http://www.haskell.org/hoogle/?hoogle=scanl – Marcin
@Marcin ah, sí, las cosas básicas. Probablemente si. Lo que me confundió fue que 'g' también se dobla sobre la secuencia. Supongo que la función de escaneo combinaría '(cero, secuencia)' con 'i' y escanearía directamente la lista' [i, j, k] '... ¡Gracias, lo intentaré! –