The opposite of `fold`
If you write Elm, you may have worked with fold functions like List.foldl
.
Yesterday I chatted with Joël Quenneville and learned about unfold
, a kind of inverse process, and how it can be useful.
Here’s my summary:
Where fold
takes:
- A reducing function
- An initial data type (e.g.
Tree
,List
) - A list
And returns:
- A new data type with all the list values reduced into it.
foldl : (a -> b -> b) -> b -> List a -> b
unfold
does the opposite.
It takes:
- A function for generating new values
- An initial data type (e.g.
Tree
,List
)
And returns:
- A list of values
unfold : (a -> Maybe (b, a)) -> a -> List b
This can be used for generating a list of values from a data source.
Here’s an implementation of unfold
, and a sample program that generates a range of integers:
ellie-app.com/gxGHDzCYp5va1
For you FP jargon-heads out there, I learned an unfold is called an “anamorphism”.
I won’t be saying that too much, but do what you will with that knowledge: https://en.wikipedia.org/wiki/Anamorphism
Thanks to Joël Quenneville for the clear explanations, as ever!
Curious to learn more?
Watch Joël’s talk: “Inverting a Binary Tree with 1 Line of Elm” at the Elm Online Meetup:
This post was originally a Twitter thread as part of Ship 30 for 30.