Proposal: add uncons (and unsnoc) to Data.List

David Feuer david.feuer at
Sat Jul 19 22:47:01 UTC 2014

Alexander Berntsen indicates that he has a branch all ready to go. Henning
Thienemann seems to prefer the term viewL. Alexander says that Edward Kmett
says that uncons/unsnoc is the more common term. Personally, I find uncons
and unsnoc to be more intuitive names. Details:

uncons :: [a] -> Maybe (a, [a])
uncons [] = Nothing
uncons (a:as) = Just (a,as)

-- Henning's implementation of "viewR", renamed, looks like

unsnoc :: [a] -> Maybe ([a], a)
unsnoc = foldr (\x -> Just . forcePair . maybe ([],x) (mapFst (x:))) Nothing

I wonder if it would be possible to tease that apart a bit to get the maybe
out of the loop, which I think might be prettier. The really tricky part of
unsnoc is making it lazy enough—messing around with it a bit suggested that
it's very easy to mess up the pair lifting. The tough rule seems to be this
mouthful, if I'm not mistaken:

unsnoc (xs ++ (y : _|_)) = Just (xs ++ _|_, _|_)

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the Libraries mailing list