[Práctico 2][Ejercicio 10]

[Práctico 2][Ejercicio 10]

de Agustin Silvano Garcia -
Número de respuestas: 3

Buenas, estoy intentando hacer el ejercicio 10 y tengo algunos inconvenientes al realizar lo pedido.


Tengo claro como es que hay que utilizar las funciones y en que órden.


Lo que me da problemas en la sintaxis, intenté hacer lo siguiente:


cantElemPares::[Int]->Int

cantElemPares (x:xs) = length(filter (==0) map (flip(mod 2 x) x:xs))


Me pueden dar una mano?


Gracias.


Saludos.


Agustín.






En respuesta a Agustin Silvano Garcia

Re: [Práctico 2][Ejercicio 10]

de Eugenio Andres Lacuesta Pessina -

Hola Agustin,

Hay un problema con la aplicación de `flip`. El tipo de la funcion es:

flip :: (a -> b -> c) -> b -> a -> c

pero en 

flip(mod 2 x)

Lo estas aplicando a una invocacion saturada de "mod". "mod 2 x" es un valor reducido, no una función, y lo que precisas tanto para el flip como para el "map" que viene despues son funciones. Observa que esto sí funciona:

(flip mod 2) x

Por otro lado, al matchear la lista como (x:xs) estas evitando el caso de la lista vacía, así que sería mejor matchear sólo "xs". Hasta ahí tendriamos:

cantElemPares xs = length(filter (==0) map (flip mod 2) xs)

Acá lo único que falta es forzar la aplicación en el lugar correcto ("$") para que los tipos coincidan. Después incluso se podrían eliminar los parentesis de "lenght" y sacar el parametro "xs" usando la composicion de funciones (eta reducción).


Saludos!