```haskell appEval :: forall a (b :: TYPE rep). (a -> b) -> Eval a -> b appEval f (Eval (IO m)) = case runRW# m of (# _, a #) -> f a ``` Ignoring levity polymorphism, this could be implemented ```haskell appEval f m = runEval (f <$> m) ``` Moreover, ```haskell runEval = appEval id ``` But what makes this interesting, I think, is its relationship with `>>=`: aside from arity wibbles, ```haskell m >>= f = appEval f m ``` This strikes me as a really pleasant property.