Rosetta Monad Did It Again
Let
Here is a small translation table, found buried in Memphis under a pill of pizza boxes:
In the same spirit, let’s paint the monad laws in different colors.
References: docs.scala-lang, wiki.haskell
MetaPostNote:
e be an expression (e.g. x*x), m a monad instance instance (e.g. [1, 2, 3]) and M its type (list here).Here is a small translation table, found buried in Memphis under a pill of pizza boxes:
| Haskell, list comprehension | [ e | x <- m ] |
| Haskell, do notation1 | do {x <- m; return (e)} |
| Haskell, bind | m >>= \x -> return (e) |
| Scala, yield | for (x <- m) yield e |
| Scala, flatMap | m.flatMap(x => M(e)) |
| Scala, map | m.map(x => e) |
In the same spirit, let’s paint the monad laws in different colors.
| Left identity | Right identity | Associativity | |
|---|---|---|---|
| Haskell, list comprehension | [ x | x <- m] ≡ m |
||
| Haskell, do notation | do {x <- [a]; f x} ≡ f a |
do {x <- m ; x} ≡ m |
do {y <- do {x <- m; f x } g y} ≡ do { x <- m; do { y <- f x; g y }}2 |
| Haskell, bind | return a >>= f ≡ f a |
m >>= return ≡ m |
(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g) |
| Scala, yield | for (x <- m) yield x ≡ m |
||
| Scala, flatMap | M(a).flatMap(f) ≡ f a |
m.flatMap(M) ≡ m |
m.flatMap(f).flatMap(g) ≡ m.flatMap(x => f(x).flatMap(g)) |
MetaPostNote:
- Find a proper way to have a nice style from markdown.
- Link or embed runnable code.
Written with StackEdit. Messed up in the process.
Comments
Post a Comment