为什么什么都没有>&燃气轮机;Haskell里只有3个算不了什么?

为什么什么都没有>&燃气轮机;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

Haskell中
>
函数的签名如下:

(>>) :: 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>>=)
不计算第二个参数。

我认为有两种方法可以解释这个选择

  • 你呼吁的事实是,与IO不同,例如,可能没有副作用。否则,不计算第二个参数是没有意义的。从这个角度来看,从逻辑的角度来看,这似乎是一个任意的选择,尽管它肯定更有效,如果可能出乎意料的话

  • 你不做任何表示错误的事情。那么,第一个参数中的错误将消除对第二个参数求值的需要。这似乎是作者选择的理由:


  • 对于其他的好答案,我想补充几点

  • 之所以
    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'.