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.
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.
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.
Sí, gracias.