繁体   English   中英

IO 里面的条款 Haskell

[英]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

其中fab都是不纯的应用计算,并且您想用纯值替换不纯的计算a ,您可以这样写:

f <*> pure 2 <*> b

很明显,您将“纯”值 2 或“纯 2”作为应用程序 function f的第一个参数传递。

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

同样根据@chepner,由于历史原因,此操作有两个 Haskell 名称—— pureApplicative类型类中使用的名称,而returnMonad类型类中使用的名称。 对于 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM