
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.
On 31 May 2013 18:31, Brandon Allbery
On Fri, May 31, 2013 at 6:16 AM, mukesh tiwari < mukeshtiwari.iiitm@gmail.com> wrote:
Data.List can be abstracted using Foldable and Traversable but unfortunately I could not find the functions corresponding to head, take.
Those are, again, more general than you want. What is the `head` of a HashMap? (Consider that an implementation may choose to randomize the hash function to avoid hash collision attacks.) Foldable and Traversable express the concept of a collection which has no meaningful concept of an element's relative position within the collection. ListLike adds the concept of position, thereby admitting an indexing operation (and, by extension, `head` which is index 0).
-- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
-- Alexander