[Parcial 2020] [Ejercicio 5]

[Parcial 2020] [Ejercicio 5]

de Nicolas Grosso San Roman -
Número de respuestas: 1

Hola!

No me queda muy claro porqué es la d. Entiendo que ya el tipo de la lista es incompatible, porque tenemos en el primer elemento un tipo (a->b) y en el segundo (a->b)->a->[a]->b. Pero de ahí a afirmar que no se le puede asignar el tipo no lo veo. Entiendo que a nivel de compilación no es posible esa lista, pero para mí la función f4 sí tiene ese tipo: recibe los argumentos correctos y retorna el tipo de argumento correcto.

Por otro lado, no supe cómo entender el tipo de la función lambda de la (a). Las funciones lambda tienen un tipo definido? Porque si lo tienen, en esa opción el tipo de f1 sería algo como (c -> (a -> b)) -> a -> [a] -> b, siendo c el tipo del argumento x.



Saludos!

En respuesta a Nicolas Grosso San Roman

Re: [Parcial 2020] [Ejercicio 5]

de Marcos Viera - InCo -
Hola,

Permitime cambiarle los nombres a los parámetros, así queda menos entreverado:

f4 f x y = head [f x, f4 f (tail x) y]

si quiero asignar el tipo f4 :: (a -> b) -> a -> [a] -> b
entonces, entre otras cosas estoy diciendo que el parámetro x tiene tipo a, que es polimórfico. O sea que debería de poder pasar cualquier cosa como x.
En cambio en la definición de la función hago (tail x), lo que indicaría que ese parámetro tiene que ser sí o sí una lista. En conclusión, el tipo es demasiado polimórfico para su implementación.

Las expresiones lambda simplemente nos permiten definir funciones a nivel de expresión, sin necesidad de asignarles un nombre. No tienen ningún tipo en especial.
Por ejemplo, la f1 del ejercicio es equivalente a:
f1 f a = f1 foo a b
where foo x = f a

saludos