Practico 2 - Ejercicio 10 c

Re: Practico 2 - Ejercicio 10 c

de Marcos Viera - InCo -
Número de respuestas: 0
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