我只是想了解为什么这不会出错:
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
答案 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
,甚至不理会作为右参数传递的函数