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

问题描述 投票:4回答:1

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

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
haskell
1个回答
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

正如你所看到的,当传递qazxsw poi作为左参数时,运算符qazxsw poi只是立即返回Nothing,并且甚至不打扰作为右参数传递的函数。

© www.soinside.com 2019 - 2024. All rights reserved.