12-12-2014, 11:28
(08-12-2014 14:43)facundoaita escribió: [ -> ]5) a.
f h m p z | h `elem` z = (head.filter (m h)) z
| otherwise = fst p
f es una funcion claro;
z es una lista, por ser el segundo parámetro de la funciones elem y filter;
h es del mismo tipo que los elementos de z, así puedo hacer el elem, ej: elem 'a' "hola", elem 1 [1,2,3,4];
* ademas h debe ser igualable, ya que elem se fija si los elementos de una lista son iguales al primer parámetro;
p es una tupla de 2 componentes por poder hacerle fst;
m es una funcion a la que pasada como parámetro h, queda aplicada parcialmente, ej: filter (==3) [2,3,4], filter (=='a') "hola" en ambos casos m es (==)
Si h se encuentra en z = la funcion devuelve el primer elemento de z que cumpla con (m h), osea que devuelve un elemento del tipo de los elementos de la lista z.
En cualquier otro caso = devuelve el primer elemento de la tupla p.
El tipo de dato que devuelve f siempre debe ser el mismo, osea que "el primer elemento de la tupla p" es del mismo tipo que "los elementos de la lista z"
Por tanto:
f:: Eq a => a -> ( a -> a -> Bool ) -> ( a , b ) -> [a] -> a
Te hago una pregunta como dedujiste el tipo de h? El ejercicio dice h `elem` z y vos lo trataste como elem h z, se debe a las comillas simples? Saludos.
PD: Se puede usar la guiá de lenguajes en el final ?