为什么Reader monad存储函数?

cib*_*en1 3 monads haskell

根据 All about monads

Monad值(Reader monad)是从环境到值的函数.绑定函数应用于绑定值,并且都可以访问共享环境.

但是,为什么有必要在这个monad中使用一个函数(而不是,例如,两个变量,一个用于环境,一个用于值)?

chi*_*chi 10

读者monad的意思是模拟一个取决于某些环境的值.或者,如果您愿意,可以使用"隐式"输入进行计算.这与沿其环境存储的值不同.

考虑一下:

newtype Reader s a = Reader (s -> a)

ask :: Reader a a
ask = Reader (\s -> s)
Run Code Online (Sandbox Code Playgroud)

这里的价值和环境是一样的.以上简单地"获取"环境中的值并返回它.

相比之下,

newtype Reader s a = Reader (s, a)

ask :: Reader a a
ask = Reader (s, s)
   where s = ???
Run Code Online (Sandbox Code Playgroud)

在这里,我们需要产生环境和价值.但我们没有实际的方法来做到这一点!在第一个例子中,环境从输入转变为输出 - 这使得实现ask变得不可能.