Ejercicio 12 - práctico 2

Ejercicio 12 - práctico 2

de Manolo Alberto Petrillo Soria -
Número de respuestas: 2
Buenas tardes, no logré terminar de comprender como se aplica la función ya que cuando quiero aplicarla a una lista no me lo permite si no es con otra función delante como head. Cualquier explicación se agradece. Saludos.
En respuesta a Manolo Alberto Petrillo Soria

Re: Ejercicio 12 - práctico 2

de Alberto Pardo -
Hola,

La cuestión es que rara2 da como resultado una lista de funciones, digamos la lista [f,g] donde f y g son funciones. Si ahora uno quiere aplicar alguna de esas funciones a un argumento va a tener que extraerla de la lista. O sea, no puedo hacer [f,g] [x,y] donde x y y son los argumentos a los que quiero aplicar f y g respectivamente. No me queda otra que hacer, por ejemplo, head [f,g] x para aplicar f a x. Algo parecido con g aplicado a y, por ej, (head . tail) [f,g] y.

Si miramos el tipado queda claro que no funciona la aplicación directa, dado que [f,g] :: [t -> u] donde t y u son ciertos tipos. La aplicación tiene este tipo (t -> u) -> t -> u que es distinto de [t -> u] -> [t] -> [u]. Podría escribir una función especial de aplicación que trabaje sobre listas de funciones, la cual tendría justamente ese tipo.

appList :: [t -> u] -> [t] -> [u]
appList [] [] = []
applist (f:fs) (x:xs) = f x : appList fs xs

Esta definición que yo escribí supone que ambas listas (de funciones y argumentos) tienen el mismo largo, podría escribir otra que no suponga eso. Ahora podría hacer appList [f,g] [x,y].

Espero esta explicación haya despejado tu duda.

Saludos,
Alberto.