UTNianos

Versión completa: Final Paradigmas de Programación 13/12/14
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
(17-12-2014 11:10)Martin. escribió: [ -> ]Correcto!, diría Susana.

Buenísimo, gracias
(17-12-2014 10:38)verne escribió: [ -> ]Yo lo razoné así:

fmagia tiene 3 parámetros y uno que pasa por aplicación parcial, o sea 4.

fmagia :: (precondición a completar) => W -> X -> Y -> Z -> Bool (devuelve Bool ya que el all que es lo último que se hace devuelve True o False)

Ahora bien, empezamos a buscar W, X, Y y Z.
Z, vendría a ser un lista ya que lo primero que se hace es aplicar map, map recibe una función que devuelve bool y una lista, y devuelve una lista (ver :t map).
Por lo tanto Z será una lista de algún tipo que llamaremos Z.

fmagia :: (precondición a completar) => W -> X -> Y -> [Z] -> Bool

Como el map (*a) va a multiplicar por "a" todos los valores de la lista, a y Z son numéricos. Y además deben ser del mismo tipo ya que el * multiplica mismos tipos (ver :t (*)). Ahí tenemos una precondición NUM y W que era el parámetro "a" es del mismo tipo que Z.

fmagia :: Num Z => Z -> X -> Y -> [Z] -> Bool

Miremos un poco la función, el resultado del map (que es una lista [Z]) va a entrar como parámetro del all. El all recibe una función que devuelve un bool y una lista que será la que se itera con la función anterior (ver :t all). Entonces "b a" va a recibir el "a" (ya definido) y cada elemento de la lista que se envió al all, entones podemos definir "b" que es mi X en mi planteo. X :: (Z -> Z -> M)
Va a devolver un valor que el tipo dependerá de lo que haga la función "b", entonces lo ponemos con otra letra "M". (esta parte la había hecho mal, deduje que "b" iba a devolver el mismo tipo de lo que recibía, pero eso no lo podés saber porque no sabés qué hace específicamente "b", entonces ponés un tipo diferente, como bien hice ahora).

fmagia :: Num Z => Z -> (Z -> Z -> M) -> Y -> [Z] -> Bool

Miremos el parámetro "c", podemos ver que es acompañado por un ">" por lo que ya sabemos que tendrá una precondición Ord.
Nos queda "Y" que vendría a representar al parámetro "c". Como vemos en la función, el ">" va a operar con "c" y lo que devuelve la función "b" (era una M). Entonces podemos decir que "c" será del tipo "M". Por lo tanto:

fmagia :: Num Z, Ord M => Z -> (Z -> Z -> M) -> M -> [Z] -> Bool

Ponemos letras más lindas...

fmagia :: Num a, Ord b => a -> (a -> a -> b) -> b -> [a] -> Bool

Esta es mi forma de hacerlo, complicado explicarla por texto. Seguro hay métodos mejores como utilizar algoritmos de inferencia de tipos, lo mío es más deductivo.

Espero que sirva, abrazo!

Y en la parte b) de este punto con tipos qué respondiste?
Es posible siempre evaluar usando como último parámetro la lista infinita [1..] ?
Pensalo un poco.
Qué hace el all? Devuelve true o false si una lista todos sus elementos cumplen con una condición.
Entonces si vos le pasas una lista infinita y todos sus elementos cumplen con la condición qué te devolvería?
(19-12-2014 19:32)Martin. escribió: [ -> ]Pensalo un poco.
Qué hace el all? Devuelve true o false si una lista todos sus elementos cumplen con una condición.
Entonces si vos le pasas una lista infinita y todos sus elementos cumplen con la condición qué te devolvería?

A ver, por la evaluación peresoza (lazy evaluation), tengo que decir que, de movida, lo evalua.
Ahora, mientras todos los valores que va generando la lista potencialmente infinita cumplan la condición va a seguir, y seguir, y seguir... no termina.
En cambio, si en algún momento encuentra uno que no lo cumple, va a cortar.
Estoy bien?
"A ver, por la evaluación peresoza (lazy evaluation), tengo que decir que, de movida, lo evalua.
Ahora, mientras todos los valores que va generando la lista potencialmente infinita cumplan la condición va a seguir, y seguir, y seguir... no termina.
En cambio, si en algún momento encuentra uno que no lo cumple, va a cortar.
Estoy bien?"

yo creo que corta por que la funcion esta definida de forma recursiva. no se si algo tiene que ver la evaluacion peresoza
(19-12-2014 20:04)tachu escribió: [ -> ]
(19-12-2014 19:32)Martin. escribió: [ -> ]Pensalo un poco.
Qué hace el all? Devuelve true o false si una lista todos sus elementos cumplen con una condición.
Entonces si vos le pasas una lista infinita y todos sus elementos cumplen con la condición qué te devolvería?

A ver, por la evaluación peresoza (lazy evaluation), tengo que decir que, de movida, lo evalua.
Ahora, mientras todos los valores que va generando la lista potencialmente infinita cumplan la condición va a seguir, y seguir, y seguir... no termina.
En cambio, si en algún momento encuentra uno que no lo cumple, va a cortar.
Estoy bien?

Volviendo a esto...
Creo que gracias a la evaluacion perezosa, va a ser posible evaluar la funcion con una lista infinita. Al tener el all adelante, cuando encuentre un valor que no cumpla la condicion va a cortar y devolver False.

por ej:

All (>4) [1..]

si probas eso en haskell automaticamente devuelve False.
Páginas: 1 2
URLs de referencia