[英]terms of IO inside Haskell
阅读内部
https://wiki.haskell.org/IO_inside
class Monad m where
unit :: a -> m a
bind :: m a -> (a -> m b) -> m b
我观察到unit
这个词似乎不再使用了,现在这个词是pure
的。 为什么? 因为我认为pure
对于这样的递归结构是不够的。
(>>=)
在这里称为bind
,我们如何调用(>>)
?
pure
这个名字是基于这样的想法,即 monad(或 applicative)通常代表某种有效的、“不纯”的计算,如果你想在更大的不纯计算中使用纯值/计算作为一个组成部分,您可以使用pure
将纯值/计算嵌入到不纯计算中。
例如,如果您有一些应用表达式:
f <*> a <*> b
其中f
、 a
和b
都是不纯的应用计算,并且您想用纯值替换不纯的计算a
,您可以这样写:
f <*> pure 2 <*> b
很明显,您将“纯”值 2 或“纯 2”作为应用程序 function f
的第一个参数传递。
根据@chepner 的评论,名称unit
从未在 monad 或应用程序的实际 Haskell 实现中使用过。 该名称来自数学定义,其中单子可以定义为一种幺半群,而“单元”操作是幺半群的标识元素。 身份元素有时被称为单位,大概是因为乘法身份,比方说,实数是“1”AKA unity AKA a unit。
同样根据@chepner,由于历史原因,此操作有两个 Haskell 名称—— pure
是Applicative
类型类中使用的名称,而return
是Monad
类型类中使用的名称。 对于 monad 的所有正确实现,这两个操作做同样的事情。 之所以选择return
这个名字,可能是因为Monad m => ma
类型的单子计算是一个小“程序”,可能会处理一些效果,然后最终返回一个a
。 如果你只想返回一个x:: a
而不处理任何效果,你只需return x
。
运算符>>
并没有真正的正式名称。 人们通常使用“然后”或简单地使用“然后”(请参阅此答案)。 这是因为当 monad 可解释为一系列操作时(例如 IO monad), a >> b
的效果是先执行a
然后执行b
。 还有一个运算符*>
做同样的事情(同样,主要是出于历史原因—— >>
用于Monad
和*>
用于Applicative
),它通常也被称为“then”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.