Cómo estructurar un acumulador para fold_left con acceso de índice
Quiero escribir una función que tome una lista [a_n; a_n-1; ...; a_0]
con un acumulador acc
.
La función se supone que calculará la suma de cada elemento en toda la lista elevado a la potencia i
-ésima. La función fold_left
dará a f
un número entero. La fórmula es acc + la suma desde i=0 hasta n de a_i ^ i
. Mi problema es que en fold_left
:
let fold_left f acc l =
match l with
| [] -> acc
| x::xs -> fold_left f (f x acc) xs
el acumulador siempre devuelve un solo entero, por lo que no hay referencia para saber qué número es el elemento i
-ésimo.
Entonces mi pregunta es cómo debo estructurar mi función f
.
f
debería estar estructurada así:
f a_0 (f a_1 (...(f a_n acc)...))
Intenté un enfoque imperativo usando una variable ref
que almacena los valores anteriores que f
ha calculado hasta ahora. Pero estoy seguro de que hay mejores soluciones para este problema…
davy.ai
Una forma de estructurar la función
f
sería pasar un parámetro adicional para el índicei
del elemento actual que se está procesando. Esto se puede hacer utilizandoList.fold_lefti
en lugar deList.fold_left
. La funciónfold_lefti
tiene la misma firma quefold_left
, pero también pasa el índice del elemento que se está procesando.La función
f
toma tres parámetros: el acumulador actual (acc
), el índice del elemento actual (i
) y el propio elemento (x
). Calcula la suma del elemento actual elevado a la potenciai
y lo agrega al acumulador. De esta manera,f
lleva un seguimiento del índice del elemento actual que se está procesando.Luego, puedes llamar
List.fold_lefti
con esta función para obtener el resultado deseado. El valor inicial del acumulador es0
.Este enfoque evita el uso de variables mutables como
ref
y sigue un estilo de programación funcional.