在不同的问题上,我在评论中找到了有关使用(->)
Monad 的实例,例如实现无点风格。
对于我来说,这有点太抽象了。好的,我已经看到了 Arrow 实例(->)
在我看来,(->)
可以在实例符号中使用,但不能在类型声明中使用(这将是另一个问题的内容)。
有没有人使用的例子(->)
作为 Monad 的实例?或者一个好的链接?
抱歉,如果这个问题可能已经在这里讨论过,但是正在寻找"(->)
单子实例"给你很多你可以想象的点击......因为几乎每个关于 Haskell 的问题都涉及到(->)
或“单子”。
对于给定类型r
,类型的函数r -> a
可以被认为是一种计算a
使用环境类型r
。给定两个函数r -> a
and a -> (r -> b)
,很容易想象,当给定一个环境(同样,类型为r
).
可是等等!这正是 monad 的意义所在!
所以我们可以创建一个 Monad 实例(->) r
实现f >>= g
通过通过r
二者皆是f
and g
。这就是 Monad 实例的用途(->) r
does.
要实际访问环境,您可以使用id :: r -> r
,您现在可以将其视为在环境中运行的计算r
并提供一个r
。要创建本地子环境,您可以使用以下命令:
inLocalEnvironment :: (r -> r) -> (r -> a) -> (r -> a)
inLocalEnvironment xform f = \env -> f (xform env)
这种将环境传递给计算的模式,然后可以在本地查询并修改它,这不仅适用于(->) r
monad,这就是为什么它被抽象为MonadReader
类,使用比我在这里使用的更明智的名称:
http://hackage.haskell.org/packages/archive/mtl/2.0.1.0/doc/html/Control-Monad-Reader-Class.html
基本上,它有两个实例:(->) r
我们在这里看到的,以及ReaderT r m
,这只是一个newtype
包装纸r -> m a
,所以它与(->) r
我在这里描述了 monad,除了它在其他一些经过转换的 monad 中提供计算。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)