UTNianos

Versión completa: Pregunta Polimorfismo Funcional
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas.. alguno si me podrá ayudar con esto le agradecería mucho:

queHace2 f x l = (head . filter ((x==).f)) l

Tengo que decir ¿Qué hace?, Dar el prototipo de la función y un ejemplo de invocación y respuesta.

Les doy un ejemplo

Main> (2*) 2 [1..10]
1
Main> (3*) 3 [1..10]
1

La verdad que no entiendo muy bien que hace esa función, si alguien me podría explicar.. gracias!
Te puedo ayudar poco, porque no me acuerdo mucho de programación funcional (y siempre odié esas funciones compuestas flasheras)

Por lo que veo ahí, tenés una función que recibe tres cosas: una f (función), una x (un valor, un número, un elemento), y una l (una lista).

Después tenés un (head . filter ((x==).f)), que para mi lo que hace es devolverte la cabeza de la lista que contiene todos los elementos de la lista l que cumplen que f aplicado a ese elemento es igual a x (tomate un tiempito para releer lo que puse =P )

mmmm.... creo eh, agarralo con pinzas. Si tengo razón, entonces cuando hagas:

Main> (2*) 4 [1..10]

te debería dar 2
Se fija que elementos de la lista,luego de aplicarles una funcion (f) resultan ser iguales al numero dado (l).Y te devuelve de esa lista de elementos,el primero.

OJO! Lo que te devuelve es el primero elemento de la lista original que cumple con esto.Es decir,antes de aplicarle la funcion ya que funcional no tiene efecto de lado.
Primero l se lo estás pasando a filter ((x==).f). Es decir, estas filtrando todos los elementos de l que al aplicarles f te dan igual a x. Esto te devuelve una lista, que se la pasas a head, y con esto te quedás con el primer elemento.

Para el prototipo:
l es una lista de cualquier cosa (digamos, [a])
f recibe elementos de esa lista, y devuelve algun otro tipo de dato (a -> b)
x tiene que poder compararse con los resultados de f, entonces tiene que ser de tipo b
Finalmente, head te devuelve un elemento de l asi que el tipo de retorno va a ser a.

La restriccion es que los elementos de b tienen que ser comparables por iguales (por el ==), entonces habría que agregar (Eq b).

Finalmente:
Eq b => (a -> b) -> b -> [a] -> a

Verificando en ghci:
Cita:Prelude> let queHace2 f x l = (head . filter ((x==).f)) l
Prelude> :t queHace2
queHace2 :: Eq b => (c -> b) -> b -> [c] -> c
Le dieron ganas de usar c en vez de a, pero esta bien =P

queHace2 f x l = (head . filter ((x==).f)) l

queHace2 (2*) 2 [1..10]


Parece que el Haskell del compilador es distinto al nuestro.
Parece que usa GHC el compilador del foro no? Es el unico compilador que conozco que se queja cuando no tenes un modulo main.
URLs de referencia