Haskell 中的 IO 条款
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(或应用程序)通常代表某种有效的、“不纯”的计算,如果您想使用纯 value/calculation 作为更大的不纯计算的一个组成部分,您可以将纯 value/calculation 嵌入到带有 pure
.
的不纯计算中
例如,如果你有一些应用表达式:
f <*> a <*> b
其中 f
、a
和 b
都是不纯的应用计算,您想用纯值替换不纯的计算 a
,你写:
f <*> pure 2 <*> b
很明显,您传递的是“纯”值 2,或“纯 2”作为应用函数的第一个参数 f
。
根据@chepner 的评论,名称 unit
从未在 monad 或应用程序的实际 Haskell 实现中使用过。该名称来自数学定义,其中单子可以定义为一种幺半群,而“单元”操作是幺半群的标识元素。身份元素有时被称为单位,大概是因为乘法单位,比方说,实数是“1”又名单位又名单位。
此外,根据@chepner,由于历史原因,此操作有两个 Haskell 名称——pure
是 Applicative
类型类中使用的名称,而 return
是 Monad
类型类中使用的名称。对于 monad 的所有正确实现,这两个操作做同样的事情。 return
这个名字的选择可能是因为 Monad m => m a
类型的单子计算是一个小“程序”,可能会处理一些效果,然后最终 return 一个 a
.如果你只想 return 一个 x :: a
而不处理任何效果,你只需 return x
.
运算符>>
并没有真正的正式名称。人们通常使用“然后”或简单地使用“然后”(参见 this answer)。这来自这样的想法,即当一个 monad 可以解释为一系列操作(例如,IO monad)时,a >> b
的效果是首先执行 a
和 then做b
。还有一个运算符 *>
做同样的事情(同样,主要是出于历史原因——>>
代表 Monad
和 *>
代表 Applicative
),它是通常也称为“然后”。
正在阅读内部
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(或应用程序)通常代表某种有效的、“不纯”的计算,如果您想使用纯 value/calculation 作为更大的不纯计算的一个组成部分,您可以将纯 value/calculation 嵌入到带有 pure
.
例如,如果你有一些应用表达式:
f <*> a <*> b
其中 f
、a
和 b
都是不纯的应用计算,您想用纯值替换不纯的计算 a
,你写:
f <*> pure 2 <*> b
很明显,您传递的是“纯”值 2,或“纯 2”作为应用函数的第一个参数 f
。
根据@chepner 的评论,名称 unit
从未在 monad 或应用程序的实际 Haskell 实现中使用过。该名称来自数学定义,其中单子可以定义为一种幺半群,而“单元”操作是幺半群的标识元素。身份元素有时被称为单位,大概是因为乘法单位,比方说,实数是“1”又名单位又名单位。
此外,根据@chepner,由于历史原因,此操作有两个 Haskell 名称——pure
是 Applicative
类型类中使用的名称,而 return
是 Monad
类型类中使用的名称。对于 monad 的所有正确实现,这两个操作做同样的事情。 return
这个名字的选择可能是因为 Monad m => m a
类型的单子计算是一个小“程序”,可能会处理一些效果,然后最终 return 一个 a
.如果你只想 return 一个 x :: a
而不处理任何效果,你只需 return x
.
运算符>>
并没有真正的正式名称。人们通常使用“然后”或简单地使用“然后”(参见 this answer)。这来自这样的想法,即当一个 monad 可以解释为一系列操作(例如,IO monad)时,a >> b
的效果是首先执行 a
和 then做b
。还有一个运算符 *>
做同样的事情(同样,主要是出于历史原因——>>
代表 Monad
和 *>
代表 Applicative
),它是通常也称为“然后”。