Chr*_*lor 15
对于单子而言,还有什么比这个想法更有启发性吗?
是的,非常如此!
Monadic绑定是一种组合函数的方法,其中除了将函数应用于输入之外的其他事情发生之外.什么别的东西是取决于所考虑的单子.
该Maybe
单子与可能性,即在链中的功能中的一个可能会失败,在这种情况下,故障自动传播到链的末端功能的组合物.表达式return x >>= f >>= g
适用f
于该值x
.如果结果是Nothing
(即失败)则整个表达式返回Nothing
,而没有其他工作发生.否则,g
应用于f x
并返回其结果.
的Either e
单子,其中e
是某种类型的,与故障的类型的误差的可能性的功能组合物e
.这在概念上与Maybe
monad 相似,但我们可以获得有关故障发生方式和位置的更多信息.
该List
单子与返回多个值的可能性的功能的组合物.如果f
和g
是返回的输出的列表功能,则return x >>= f >>= g
适用f
于x
,然后应用g
到每个输出f
,所有这些应用程序的输出收集到一起成为一个大名单.
其他monad代表各种其他环境中的功能组合.非常简短:
该Writer w
单子与类型的值功能组合物w
的一侧上进行累计.例如,经常w = [String]
(字符串列表)对日志记录很有用.
该Reader r
单子是功能组合物,其中每个功能也允许取决于类型的值r
.这在为特定于域的语言构建评估程序时非常有用,例如,r
可能是从变量名称到语言中的值的映射 - 例如,这允许简单地实现词法闭包.
该State s
单子有点像读写器的组合.它是函数组合,其中允许每个函数依赖并修改类型的值s
.
事实上,构成观点本身就很有启发性.
Monads可以被视为表单功能之间的一些"时髦组合" a -> Mb
.你可以通过monad操作组合f : a -> M b
并g: b -> M c
进入某些东西a -> M c
(只需绑定f
into 的返回值g
).
这接通形式的箭头a -> M b
作为一个类别的箭头所示,被称为Kleisli类别的M
.
如果M
不是一个单子,但只是一个仿函数,你会只能够撰写fmap g
并f
到的东西(fmap g) . f :: a -> M (M c)
.Monads join :: M (M a) -> M a
让我只使用monad操作定义为(简单且有用)练习(对于数学家来说,join
通常是monad定义的一部分).然后join . (fmap g) . f
提供Kleisli类别的组合.
因此可以看出所有monadic组合的funk发生在里面join
,join
表示副作用的组成:因为IO
它对效果进行排序,因为List
它连接列表,因为Maybe
它在结果为"停止计算"时Nothing
为Writer
它排序写入,对于State
它的状态等操作序列,可以被看作是一个"重载分号"如果你知道类似C语言.以这种方式思考monads是非常有益的.
当然,Dan Piponi比我更好地解释了这一点,这里有一些他可能会发现启发的帖子:http://blog.sigfpe.com/2006/06/monads-kleisli-arrows-comonads-and. HTML
归档时间: |
|
查看次数: |
491 次 |
最近记录: |