# 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.