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