
On Fri, Aug 1, 2014 at 7:21 PM, David Feuer
Way back in 2001, Shin-Cheng Mu proposed an unfoldr1 combinator: http://code.haskell.org/~dons/haskell-1990-2000/msg06775.html
I discussed this a bit with shachaf in #haskell, and he noted that a similar function, with a slightly different but isomorphic type, appears in Edward Kmett's semigroups package as the unfoldr for NonEmpty.
I propose that we add this. It can be written
unfoldr1 :: (b -> (a, Maybe b)) -> b -> [a] unfoldr1 f b = go b where go b = case f b of (a, may_b) -> a : maybe [] go may_b
With the appropriate RULES, it can be wrapped up in build and fuse properly.
I'd love to see this written as an unfoldr instead. Does anyone know if that's possible?
unfoldr1 :: (b -> (a, Maybe b)) -> b -> [a] unfoldr1 f = unfoldr (fmap f) . Just Note that unless unfoldr is inlined whenever its first argument is supplied, the use of (Maybe b) as the seed type means you'll get a lot more allocation and case analysis than in your direct definition. -- Live well, ~wren