Practico 2 - Ejercicio 10 c

Practico 2 - Ejercicio 10 c

de Rodrigo Alain De La Vega Rodriguez -
Número de respuestas: 1

Buenas! Tengo tres preguntas respecto a este ejercicio.

La solución que me funciono es la siguiente:
getPares3 :: [Int] -> Int
getPares3 xs = length $ filter (==0) $ map (\x -> x `mod` 2) xs

Pero luego trate de cambiar algunas cosas y no entiendo por que me da error
1)
getPares3 xs = length $ filter (==0) $ map (\x -> x `mod` 2) xs

No entiendo por que el $ en la linea: filter (==0) $ map (\x -> x `mod` 2) xs va ahi.
O sea pienso que es porque esta diciendo que se aplique la función (==0) sobre la lista resultado del map pero de entrada pensé que se debería aplicar asi: filter $ (==0) map (\x -> x `mod` 2) xs
ya que la idea era que aplicara la función filter a esos dos argumentos.

2)
getPares3 = length $ filter (==0) $ map (\x -> x `mod` 2)

Entendia que el xs lo podia sacar ya que quedaba implicito pero no entiendo por que no puedo hacerlo en esta definicion.

3)
La composición de funcion (.) y el $ no se pueden usar juntos en la misma linea de definicion no?

Gracias!

En respuesta a Rodrigo Alain De La Vega Rodriguez

Re: Practico 2 - Ejercicio 10 c

de Marcos Viera - InCo -
Hola, van las respuestas:

1)
Poner ese $ en la aplicación del filter, es equivalente a poner los paréntesis:

getPares3 xs = length $ filter (==0) (map (\x -> x `mod` 2) xs)

o sea, indicar que el filter va a a recibir como argumentos la función (==0) y la lista resultante de hacer (map (\x -> x `mod` 2) xs).
Si no ponés el $ ni los paréntesis, como la aplicación asocia a la izquierda, la definición te quedaría equivalente a (si lo llenamos de paréntesis):

getPares3 xs = length $ (((filter (==0)) map) (\x -> x `mod` 2)) xs

que no es lo mismo (y no compila).

2)
Si a esto:


getPares3 = length $ filter (==0) $ map (\x -> x `mod` 2)

le ponés paréntesis en lugar de $, entonces tendrías:

getPares3 = length $ filter (==0) (map (\x -> x `mod` 2))

lo que indica que el filter recibe como argumentos a la función (==0) y el resultado de hacer (map (\x -> x `mod` 2)), que como el map no está saturado, no sería una lista. Por lo tanto eso no compila.

Sí compilaría si en lugar de ($), que es la aplicación, usamos (.), la composición:

getPares3 = length . filter (==0) map (\x -> x `mod` 2)

3) No hay problema con usar (.) y ($) en la misma línea, por ejemplo se puede hacer:

getPares3 xs = length . filter (==0) $ map (\x -> x `mod` 2) xs

saludos