[Ejercicio Autoevaluacion] [Definiciones y Tipos Algebraicos] Por que algo compila y otra cosa no

[Ejercicio Autoevaluacion] [Definiciones y Tipos Algebraicos] Por que algo compila y otra cosa no

de Federico Matonte Martinez -
Número de respuestas: 3

Buenas realizando el siguiente ejercicio nos surgio una duda:

Complete la siguiente definición de any:

any :: (a -> Bool) -> [a] -> Bool
any p =  <?> . filter p
Con la respuesta correcta < ?> == "not . null" podemos cargar un modulo, y si ejecutamos:
"any (==1) [1,2,3]" y obtenemos el resultado esperado.

Sin embargo  si intentamos correrlo a mano: "not . null . filter (==1) [1,2,3]" nos da error de tipo y tenemos que forzar que resuelva primero el filter  para que corra "not . null $ filter (==1) [1,2,3]". No entendemos por que no exige lo mismo en ambos casos.

En respuesta a Federico Matonte Martinez

Re: [Ejercicio Autoevaluacion] [Definiciones y Tipos Algebraicos] Por que algo compila y otra cosa no

de Marcos Viera - InCo -
Tienen un problema de precedencia, tienen que poner paréntesis: (not . null . filter (==1)) [1,2,3]

Si no ponen esos paréntesis, la expresión se interpreta como si fuera: not . null . (filter (==1) [1,2,3])


En respuesta a Marcos Viera - InCo

Re: [Ejercicio Autoevaluacion] [Definiciones y Tipos Algebraicos] Por que algo compila y otra cosa no

de Federico Matonte Martinez -

Pero por que no se interpreta de esa misma forma en la definición de any?

En respuesta a Federico Matonte Martinez

Re: [Ejercicio Autoevaluacion] [Definiciones y Tipos Algebraicos] Por que algo compila y otra cosa no

de Marcos Viera - InCo -

Porque la definición de any se define una función que dado p retorna una función. Esa función es lo que ponés entre paréntesis.