[Ejercicio 1 - parte b] - [Práctico 4]

[Ejercicio 1 - parte b] - [Práctico 4]

de Juan Carlos Sosa Gómez -
Número de respuestas: 3

Buenas, que tal?

Cuando dice en función de foldN, es resolver como foldN, verdad?.
Quisiera saber algún pique para resolver suma y predecesor en función de foldN.

En la parte (a) las mismas fueron resultas de la siguiente manera:

suma :: Nat -> Nat -> Nat

suma Zero n = n

suma n Zero = n

suma (Succ n1) n2 = Succ (suma n1 n2)


predecesor :: Nat -> Nat

predecesor Zero = Zero

predecesor (Succ n) = n


Gracias,
Saludos.

En respuesta a Juan Carlos Sosa Gómez

Re: [Ejercicio 1 - parte b] - [Práctico 4]

de Alberto Pardo -
Hola,

Respecto a la suma, la segunda ecuación (suma n Zero = n) es innecesaria. Fijate que el segundo argumento de suma juega el rol de parámetro constante durante la recursión; simplemente lo retornás cuando el primer parámetro llega a Zero.

La definición de suma en términos de foldN es muy similar a la de append (++) en términos de foldr. Hay varias alternativas pero lo mas sencillo es plantearla de esta forma:

suma m n = foldN h e m
where h = ...
e = ...

El foldN lo estoy definiendo sobre m (que fue el argumento recursivo en tu definición). Es claro que en el cuerpo del foldN (esto es, en h o en e) tiene que aparecer n. Te dejo para que pienses las definiciones de h y e.

Ahora, respecto a predecesor, la definición que das es correcta, Escribirlo en términos de foldN no es inmediato. Tiene el mismo problema que tiene escribir dropWhile p xs en términos de foldr. El problema está en la forma que tiene el esquema recursivo foldN. En efecto, el paso recursivo (la función h en foldN h e) solo puede utilizar como entrada el resultado de la llamada recursiva.

foldN h e (Succ n) = h (foldN h e n)

El problema en el caso del predecesor es que h precisa conocer el valor n para poder retornarlo, pero no lo tiene a mano (la definición de h no puede depender del n que está a la izquierda de la ecuación). Por lo tanto, si ese valor no está accesible, entonces la salida que hay es escribir una definición en términos de foldN que reconstruya el n para poder retornarlo. Te dejo para que lo pienses con esta sugerencia.

Saludos,
Alberto.
En respuesta a Juan Carlos Sosa Gómez

Re: [Ejercicio 1 - parte b] - [Práctico 4]

de Daniel Alejandro Garcia Miranda -