I need to add that it's perfectly valid to define all operation in terms of Folds and so it's possible to define take, head, and such functions for all
Foldable instances as they have a path to fold over them:
the key idea is to store a state while folding over a structure:
headF :: (Foldable x) => x a -> a
headF = snd . F.foldl (\(s,v) n -> if s then (s,v) else (True,n)) (False, error "empty")
takeF :: (Foldable x) => Int -> x a -> [a]
takeF c = reverse . snd . F.foldl (\(i,v) n -> if i < c then (i+1,n:v) else (i,v)) (0,[])
In domain of a lazy languages we will even stop evaluation as soon as we will get result without additional steps.