我只是想了解为什么这不会出错:
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
当你写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
正如你所看到的,当传递qazxsw poi作为左参数时,运算符qazxsw poi只是立即返回Nothing
,并且甚至不打扰作为右参数传递的函数。