为什么什么都没有>&燃气轮机;Haskell里只有3个算不了什么?
Haskell中为什么什么都没有>&燃气轮机;Haskell里只有3个算不了什么?,haskell,monads,Haskell,Monads,Haskell中>函数的签名如下: (>>) :: m a -> m b -> m b 默认实现是: x >> y = x >>= \_ -> y 通过这一点,我了解到>函数总是返回其右参数,而不管左参数的值如何。lambda甚至不关心左参数(x)的值。那么,为什么Nothing>>只有3等于Nothing?它不应该只返回3,因为这是右边参数的值吗 我知道任何Just值在与Nothing关联时都将返回Nothing,但在这种情况下,Not
>
函数的签名如下:
(>>) :: m a -> m b -> m b
默认实现是:
x >> y = x >>= \_ -> y
通过这一点,我了解到>
函数总是返回其右参数,而不管左参数的值如何。lambda甚至不关心左参数(x)的值。那么,为什么Nothing>>只有3
等于Nothing
?它不应该只返回3
,因为这是右边参数的值吗
我知道任何Just
值在与Nothing
关联时都将返回Nothing
,但在这种情况下,Nothing
甚至不会被lambda捕获。我错过了什么
有奖问题,>=
称为绑定。什么叫>
谢谢。要真正了解
(>>)
在这种情况下的作用,您必须了解:
Nothing>>=k
计算结果为Nothing
,无论k
函数是什么。在(>>)
的特定情况下,k
恰好是\\uy>
,因为绑定甚至不关心lambda的值是什么
Just x >>= f = f x
Nothing >>= _ = Nothing
注意
(Nothing>>=)
不计算第二个参数。我认为有两种方法可以解释这个选择
对于其他的好答案,我想补充几点
Nothing>>=f
必须是Nothing
,是因为不可能检查f
是否实际使用了它的参数(至少没有可怕的不安全的黑客攻击)x>>y=x>=\\\->y
不仅仅是默认实现。>
的定义应始终产生与此定义相同的结果。它只允许重载,因为它有时可以更有效地实现m>>=f
调用它在m
中“找到”的值的f
,“组合”结果(在一元值中“找到”的值的含义和“组合”的含义是一元特定的)
m>>n
必须等同于m>=\\\\->n
。因此,对于它在m
中找到的每个值,它都会在其上调用\\uu->n
。但是中没有任何内容
可能monad的“内部”没有任何值。因此,\\\->n
甚至不能对任何对象调用,以便忽略它并返回n
!因此Nothing>=\\\->n
必须返回不依赖于n
的内容,因为它无法调用函数来获取n
。在这个上下文中也没有任何wrapped类型的值浮动,因此唯一可用的选项就是Nothing
因此,与其凭直觉理解,它忽略了左边的内容,返回右边的内容,不如认为它采用左边内容的“一元结构”,并将其与右边的一元值绑定。“一元结构”是一个hand-wavey术语,表示“定义一元值的所有事物,而不是其中的值”
listA>>listB
执行相同的操作,而不考虑listA
中的特定值,但其中有多少元素很重要<代码>ioA>>ioB做同样的事情,而不管执行ioA
会产生什么值,但重要的是产生它的副作用stateA>>stateB
忽略由stateA
生成的值,但将当前状态发送到stateB
。而maybeA>>maybeB
做同样的事情,而不管maybeA
中的特定值是什么,但是否有值很重要。请注意,列表案例的行为非常类似于Maybe
;如果listA
为空,则listA>>listB
也必须为空
至于你的额外问题,当我(在脑海中)读代码时,我倾向于把
>=
和>
都读成“bind”;当我在读代码的同时也在读代码的时候,我对上下文有足够的非语言意识,这种歧义并不重要。事实上,我不知道我会说些什么来与某人大声谈论=
和>
;也许是“绑定”和“健忘绑定”?啊,当然。。。这就是我所缺少的。谢谢我知道我错过了什么。谢谢:这是有道理的。我并不是真的在争论逻辑,我只是不明白为什么它什么也不返回,但正如@duplode和leftaroundabout指出的,它与绑定函数的定义有关。谢谢谢谢你的提问!我也对结果感到困惑。知道自己不是唯一一个错过它的人让我感觉更好;)谢谢你的解释。它为前面的答案增加了很多价值。感谢您添加这些信息。
Just x >>= f = f x
Nothing >>= _ = Nothing
-- The 'Maybe' type is also a monad. It is a simple kind of error
-- monad, where all errors are represented by 'Nothing'.