> Claro, quise reflejar que primero se aplica take y drop, pero cómo es take 4 y drop 4 sería entonces:
> > rara2 :: Num a => [([a] -> Int)]
> No se si incluir lo de Num a => (sum lo pide, length no, entonces para que contenga a ambos se incluye no?)
> Dude en el tipo que devuelve porque sum devuelve a pero length Int, entonces Int restringe mas para contener a ambas no?
Veamos los tipos de ambas funciones (les pongo nombres distintos a las variables de tipo para no confundir):
length . drop 4 :: [a] -> Int
sum . take 4 :: Num b => [b] -> b
De esto podemos deducir que
b = Int
(que cumple con la condición de ser instancia de Num)
y
a = b
Entonces el tipo es:
[[Int] -> Int]
> Bien. Por comprensión es sacar map de lo que puse:
> > [ x arg | x <- rara2]
> Pero map viendo su tipo, recibe una función y la aplica a todos los elementos de la lista, habría que ir aplicando uno por uno y unificando en una sola lista. Más fácil por comprensión,
> no se me ocurre ahora con map.
La definición por comprensión que diste está perfecta, aunque yo a la variable la llamaría 'f' en lugar de 'x' :-)
En el caso del map, la función que tendría que pasarle es la que aplica la función que tengo en la lista al argumento arg.
Si la implementamos como una función anónima nos quedaría:
map (\f -> f arg) rara2
o lo que es lo mismo, aplicando flip y el operador de aplicación:
map (flip ($) arg) rara2
o lo que es lo mismo, usando secciones:
map ($ arg) rara2