Practico 03 implementaciones con foldl y foldr

Re: Practico 03 implementaciones con foldl y foldr

de Marcos Viera - InCo -
Número de respuestas: 0

Hola, 

El tema es que foldr y foldl capturan esquemas de recursión distintos.

En el caso de foldr, decimos que cualquier función que tenga la forma:

h :: [a] -> b 
h [ ]        = e
h (x : xs) = f x (h xs) 

se puede escribir como h = foldr f e.

Mientras que foldl captura definiciones de la forma:

h = h_acc e  

h_acc :: b -> [a] -> b
h_acc v [ ]        = v
h_acc v (x : xs) = h_acc (f v x) xs 

que se pueden escribir como h = foldl f e.

Por lo que si querés pasar una función definida de forma recursiva a la aplicación de uno de los folds, la función tiene que cumplir con el esquema correspondiente.

Por ejemplo, en el caso de sumSqs, si lo pensás como una función definida en base al segundo esquema:

sumSqs_re = sumSqs_acc 0

sumSqs_acc :: Num a => a -> [a] -> a
sumSqs_acc v []     = v
sumSqs_acc v (x:xs) = sumSqs_acc (x * x + v) xs

el foldl es directo:

sumSqs_fl = foldl (\v x -> x * x + v) 0