03:33 pm, 22 Aug 06

### another monad to become familiar with

A guy at work who's ten times the Haskell hacker I'll ever be pointed me at this thread, where someone is wondering whether a pattern of applying multiple functions to the same value can be generalized. As an example they provide:

which could be used to e.g. apply something to both halves of a pair in one go:

This seems obscure enough to me, but the response they get, on a simpler implementation, is done in a single word.

The answer?

`eval :: (b->c->d) -> (a->b) -> (a->c) -> (a->d)`

eval f g1 g2 a = f (g1 a) (g2 a)

which could be used to e.g. apply something to both halves of a pair in one go:

`(eval (==) fst snd) somePair`

This seems obscure enough to me, but the response they get, on a simpler implementation, is done in a single word.

The answer?

`eval = liftM2`

, because there's some instance for functions themselves: `((->) a)`

is an instance of `MonadReader`

, which I don't yet fully get. I need to learn how functional dependencies work first, I think.