I came across the excellent

Monad Challenges, a collection of exercises designed to take you through what have become some of the standard example monads and take you through the process that motivates monads as a way to handle these seemingly diverse data structures. Both the Monad Challenges and the 20 Intermediate Exercises are well worth your time. Doing them both is helping me a lot.

That said, they don't quite match up. 20IE's

**banana** is

**flip bind** and

**apple** is

**flip ap**. (This isn't unique; the also excellent

*Learning Haskell from first principles* has as an exercise writing

**bind** in terms of

**fmap** and

**join**, but the declaration it gives has the type of

**flip bind**. The authors do point this out.) As a result, I find myself with something that there's got to be some way to simplify, of the form

**foo = flip $ (flip mumble) . (flip frotz)**
I'd like to think there's some sort of distributive-like law to be found and used here... watch this space.

## Comments