So we reach the end of our twelve(ish) monads, or maybe if you are visiting from the future, the beginning.
A continuation is “the rest of the program” represented as a value that you can do value things to: stick it in a variable, store it in a data structure, pass it around to other functions, as well as (if you want) actually cause it to run.
I saw mention of this at Haskell eXchange 2016. I haven’t done anything with it, but it intrigued me so I decided to include a post in this series.
Advertised as type-safe dynamic typing without needing Typeable class constraints, Key…
Free monads let you take a data type that represents instructions, or (approximately the same) effects that you want to happen, and then have interpreters which understand how to make those effects actually happen.
On day 5, I wrote about how to make a set monad — first build a sequence of instructions that describe how to build a Set, and then interpret that sequence of instructions to give a result, an actual Set.
Set
The list monad lets you perform non-deterministic searches for a solution to a problem. At each step of your program, you can provide a choice of possible values to bind to a variable, and the rest of the program will run several times, trying each possible value and…
In the Reader monad, all you can do is query the environment by asking for the whole environment. If you only want a little bit of that environment, you can apply a function to the environment. For example, you might ask for the…
Reader
ask
Lazy evaluation lets us compose two different computations without thinking too much about who is “in control”: we can generate primes lazily, and take the root of them lazily and evaluation alternates back and…
Sets are a bit like lists, and so you can probably imagine that there should be a Monad instance for them. The first part of this post will be why that does not work in the “obvious” way, and the second part will describe a different way that does work.
Monad
Reader, Writer and State usually come presented together, because they’re very similar: these monads wire together functions by adding in extra parameters or return values. There is no non-determinism, change in control flow, or…