Haskell:为什么 "Nothing<(4::Maybe Int)" 出错但 "Nothing< Just 4" 通过?

Haskell: Why "Nothing<(4::Maybe Int)" gets an error but "Nothing< Just 4" pass?

Nothing 的类型可能是 Maybe Int 为什么不能与另一个 Maybe Int 进行比较?

为什么 Nothing< Just 4 通过?

您的表达式中存在一个简单的类型错误:4 没有类型 Maybe Int

是的,Nothing 可以是 Maybe Int 类型(或 Maybe String,或 Maybe AnythingElse)。

任何两个 Maybe Int 类型的值都可以进行比较。

等式 == 的定义如人们所料:Nothing 仅等于 Nothing,而 Just x 仅等于 Just y,如果 x==y。这是在 Maybe aEq 实例中定义的,它是自动导入的,因为它在 Haskell Prelude.

同样,Prelude中也有一个Ord (Maybe a)实例。此实例在 Maybe Int 之间定义 <,因此 Nothing 是最小元素(< 任何其他元素),而两个值 Just xJust y根据是否x < y.

进行比较

所以,Nothing < Just 4是正确的。


代码 Nothing<(4::Maybe Int) 给你一个错误,因为 4 是一个 Int(从技术上讲,它是 Num 类型 class 中的任何类型) ,但 4 不是 Maybe Int。如果你写 4 :: String4 :: [Int]4 :: Int -> Int 你会得到一个类似的类型错误。

Maybe Int 类型仅包含值

Nothing
Just 0
Just 1
Just -1
Just 2
Just -2
...

(还有一些底部,我省略了。)

4 不是 Maybe Int 类型的值。 Just 4 是这样的值之一。