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变得不可能.