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

其中 fab 都是不纯的应用计算,您想用纯值替换不纯的计算 a,你写:

f <*> pure 2 <*> b

很明显,您传递的是“纯”值 2,或“纯 2”作为应用函数的第一个参数 f

根据@chepner 的评论,名称 unit 从未在 monad 或应用程序的实际 Haskell 实现中使用过。该名称来自数学定义,其中单子可以定义为一种幺半群,而“单元”操作是幺半群的标识元素。身份元素有时被称为单位,大概是因为乘法单位,比方说,实数是“1”又名单位又名单位。

此外,根据@chepner,由于历史原因,此操作有两个 Haskell 名称——pureApplicative 类型类中使用的名称,而 returnMonad 类型类中使用的名称。对于 monad 的所有正确实现,这两个操作做同样的事情。 return 这个名字的选择可能是因为 Monad m => m a 类型的单子计算是一个小“程序”,可能会处理一些效果,然后最终 return 一个 a .如果你只想 return 一个 x :: a 而不处理任何效果,你只需 return x.

运算符>>并没有真正的正式名称。人们通常使用“然后”或简单地使用“然后”(参见 this answer)。这来自这样的想法,即当一个 monad 可以解释为一系列操作(例如,IO monad)时,a >> b 的效果是首先执行 athenb。还有一个运算符 *> 做同样的事情(同样,主要是出于历史原因——>> 代表 Monad*> 代表 Applicative),它是通常也称为“然后”。