[Haskell-cafe] Is it possible to change the environment (reader) in applicative style?

Olaf Klinke olf at aatal-apotheke.de
Wed Sep 12 19:28:05 UTC 2018

Neither >>= nor 'return' nor 'join' for the reader monad change the environment, hence the name "reader". Thus I'd chime in and claim it is not possible using the Applicative or Monad combinators alone. After all, the reader monad is ignorant of what type it is reading. In other words, if the type class combinators alone could do this, then you'd have a function that worked for _every_ type Env. But updating a list of (variable,value) pairs is a rather specific task. Fixing the syntax for this post:

type Reader a = Env -> a

Since your 'let' function modifies the environment, it yields a function of type

Env -> Env = Reader Env

Say that your 'let' has the type

let :: Def -> Reader Env

for a suitable type Def, e.g. Def = (String,Int).
Suppose you have implemented 'let'. We know the Applicative and Monad type class functions won't help here. But observe that (.) can be specialized to

(.) :: Reader a -> Reader Env -> Reader a

whence you can write 

eval term . let newBinding where
  term :: Term
  eval :: Term -> Reader Int
  let :: Def -> Reader Env
  newBinding :: Def


More information about the Haskell-Cafe mailing list