The
unfoldr function is a `dual' to
foldr: while
foldr reduces a list to a summary value,
unfoldr builds
a list from a seed value. The function takes the element and returns
Nothing if it is done producing the list or returns
Just
(a,b), in which case,
a is a prepended to the list
and
b is used as the next element in a recursive call. For
example,
iterate f == unfoldr (\x -> Just (x, f x))
In some cases,
unfoldr can undo a
foldr operation:
unfoldr f' (foldr f z xs) == xs
if the following holds:
f' (f x y) = Just (x,y)
f' z = Nothing
Laziness
>>> take 1 (unfoldr (\x -> Just (x, undefined)) 'a')
"a"
Examples
>>> unfoldr (\b -> if b == 0 then Nothing else Just (b, b-1)) 10
[10,9,8,7,6,5,4,3,2,1]
>>> take 10 $ unfoldr (\(x, y) -> Just (x, (y, x + y))) (0, 1)
[0,1,1,2,3,5,8,13,21,54]