当Haskell传递给返回Just x的lambda时,如何知道什么都不保留?

时间:2019-04-24 01:27:14

标签: haskell

我只是想了解为什么这不会出错:

Prelude> Nothing >>= (\x -> Just $ x + 3)
Nothing

如果我将lambda分解为单独的步骤,则:

Prelude> Nothing + 3

<interactive>:8:1: error:
    • Non type-variable argument in the constraint: Num (Maybe a)
      (Use FlexibleContexts to permit this)
    • When checking the inferred type
        it :: forall a. Num (Maybe a) => Maybe a

Prelude> Just Nothing
Just Nothing

1 个答案:

答案 0 :(得分:19)

当您写Nothing >>= (\x -> Just $ x + 3)时,这与Just $ Nothing + 3完全不同。您实际上并没有传递Nothing作为x的值。

相反,您要调用运算符>>=,并且要向其中传递两个参数:左侧的Nothing和右侧的lambda表达式。

因此,该表达式的结果将由运算符>>=的定义确定。让我们看一下how it is defined for Maybe

(Just x) >>= f  =  f x
Nothing  >>= f  =  Nothing

如您所见,当将Nothing作为左参数传递时,运算符>>=只是立即返回Nothing,甚至不理会作为右参数传递的函数