Haskell:为什么“Nothing<(4 :: Maybe Int)”会收到错误,但“Nothing< Just 4”会通过?

时间:2015-01-02 09:12:29

标签: haskell functional-programming

Nothing的类型可能是Maybe Int,为何无法将其与另一个Maybe Int进行比较?

为什么Nothing< Just 4通过?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

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

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

平等==定义为人们可能期望:Nothing仅等于Nothing,而Just x仅等于Just y {{1} }}。这在x==y的{​​{1}}实例中定义,该实例会自动导入,因为它位于Haskell Eq中。

同样,Maybe a中也有Prelude个实例。此实例在Ord (Maybe a)之间定义Prelude,以便<是最小元素(Maybe Int其他任何内容),而两个值Nothing<根据是否Just x进行比较。

所以,Just y是真的。


代码x < y给出错误,因为Nothing < Just 4Nothing<(4::Maybe Int)(从技术上讲,它是4类型类中的任何类型),但是{{1} }不是Int。如果您撰写Num4Maybe Int,您将收到类似的类型错误。

4 :: String类型仅包含值

4 :: [Int]

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

4 :: Int -> Int不是Maybe Int类型的值。 Nothing Just 0 Just 1 Just -1 Just 2 Just -2 ... 是其中一个值。