Hola Lucas,
Repaso las definiciones de foldr:
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f e [] = e
foldr f e (x:xs) = f x (foldr f e xs)
y foldl:
foldl :: (b -> a -> b) -> b -> [a] ->
b
foldl f v [] = v
foldl f v (x:xs) = foldl f (f v x) xs
El problema es que foldl no "produce nada" hasta que llega al paso base, lo que requiere que recorra toda la lista. La función take no tiene oportunidad de ir armando la lista resultado, por lo que la evaluación diverge.
En el caso de foldr, en cada paso recursivo la aplicación de la función f va a estar produciendo un constructor cons, (:), que puede ser consumido por take para ir construyendo la lista de cuatro elementos que se solicita.
Saludos,
Germán.