Ejercicios de repaso Definiciones

Ejercicios de repaso Definiciones

de Lucas Hernan Bruzzone Rodriguez -
Número de respuestas: 5

Buenas. Lo he intentado de resolver en varias oportunidades pero no me queda claro la correcta resolucion de este ejercicio

foo = foldl (.) (+2) [(+1),(*2),(+4)]
Se debe evaluar (foo 10).

Podrian hacer, si no es molestia, un paso a paso de como se evaluaria en el comienzo para asi lograr entender?

Muchas gracias

En respuesta a Lucas Hernan Bruzzone Rodriguez

Re: Ejercicios de repaso Definiciones

de Lucas Hernan Bruzzone Rodriguez -

Otra consulta sobre otro tipo de Ejercicios de Repaso (Evaluación Perezosa).

A)

data Arbol a = Vacio | Nodo (Arbol a) a (Arbol a)
genera = fst $ generaAux 0
  where generaAux n  =  let  (l,n' )  = generaAux (n+1)
                             (r,n'')  = generaAux n'
                        in   (Nodo  l n r, n'')
recorreL  (Nodo l x _)  = x : recorreL l
recorreL  Vacio         = []
Se debe evaluar `take 5 . tail . recorreL $ genera`

B)

data Arbol a = Vacio | Nodo (Arbol a) a (Arbol a)
genera = fst $ generaAux 0
  where generaAux n  =  let  (l,n' )  = generaAux (n+1)
                             (r,n'')  = generaAux n'
                        in   (Nodo  l n r, n'')
recorreR  (Nodo _ x r)  = x : recorreR r
recorreR  Vacio         = []
Se debe evaluar `take 5 . tail . recorreR $ genera`


No me queda claro por que B) diverge y A) no. La unica diferencia que veo es que en `Nodo l n r`, uno recorre por l y otro por r (en las funciones recorreL y recorreR respectivamente). Pero no me queda claro por qué esto causa que uno diverga y el otro no.

Muchas gracias

En respuesta a Lucas Hernan Bruzzone Rodriguez

Re: Ejercicios de repaso Definiciones

de Juan Pablo García Garland -

Creo que este ejercicio genera dudas porque hay mucho alto orden; tenemos una lista de funciones, la consumimos con un foldl que entonces debe tener un argumento que combine funciones (la composición, en este caso), entonces el resultado es una función, que luego podemos aplicar a 10.

Siempre en estos casos una solución posible es empezar a evaluar paso a paso, aunque puede que existan "atajos". En este caso puntual no importa qué estrategia de reducción usamos porque no hay ninguna computación que pueda no terminar.

Recordemos la definición de foldl:

foldl f v [] = v
foldl f v (x : xs) = foldl f (f v x) xs

Reduciendo un paso:

foo 10 =
(foldl (.) (+2) [(+1),(*2),(+4)]) 10 = 
(foldl (.) ((+2) . (+1)) [(*2),(+4)]) 10

En la primer igualdad desplegué la definición de foo (usando el caso recursivo) en la segunda damos el paso de cómputo, escribimos la composición infija para que sea más legible.

Podemos continuar:

(foldl (.) ((+2) . (+1)) [(*2),(+4)]) 10 =
(foldl (.) (((+2) . (+1)) . (*2)) [(+4)]) 10 =
(foldl (.) ((((+2) . (+1)) . (*2)) . (+4)) []) 10

Finalmente, la próxima reducción es aplicando la primera cláusula de la definición, con el pattern de la lista vacía. Obtenemos:

((((+2) . (+1)) . (*2)) . (+4)) 10

Además de reducir paso a paso hasta aqui, otra opción (un "atajo") sería pensar directamente en la semántica del foldl para reescribir la lista (sabiendo que se va a aplicar f asociando a la izquierda).

Para calcular el resultado podemos seguir reduciendo o podemos pensar en el resultado ignorando los paréntesis internos porque la composición es asociativa, en cualquier caso, lo que nos da es: al 10 sumamos 4, luego multiplicamos por dos, luego sumamos 1 y luego 2 (31).

¿Se entiende? Cualquier cosa la seguimos.

En respuesta a Juan Pablo García Garland

Re: Ejercicios de repaso Definiciones

de Lucas Hernan Bruzzone Rodriguez -

Muchisimas gracias por tomarte el tiempo de explicar el ejercicio tan detalladamente, me quedó mucho mas claro pero aún no del todo.

Dentro del ejemplo, y de la definicion de `foldl`: (Esto es lo que yo entiendo que es así)

  • La funcion f seria la composicion (.)
  • El paso base v seria la seccion (+2)
  • La lista seria [(+1), (*2), (+4)]


Recordando también el tipo de foldl: `foldl:: (a->b->a) -> a-> [b] -> a`
No entiendo en donde aparece el 10 en todo esto y como es que se le calcula el resultado habiendo concluido con los pasos del `foldl`



En respuesta a Lucas Hernan Bruzzone Rodriguez

Re: Ejercicios de repaso Definiciones

de Marcos Viera - InCo -
El resultado de la aplicación del foldl en este caso es una función, que luego la aplicamos a 10 y obtenemos el resultado.