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 a
的 Eq
实例中定义的,它是自动导入的,因为它在 Haskell Prelude
.
中
同样,Prelude
中也有一个Ord (Maybe a)
实例。此实例在 Maybe Int
之间定义 <
,因此 Nothing
是最小元素(<
任何其他元素),而两个值 Just x
和 Just y
根据是否x < y
.
进行比较
所以,Nothing < Just 4
是正确的。
代码 Nothing<(4::Maybe Int)
给你一个错误,因为 4
是一个 Int
(从技术上讲,它是 Num
类型 class 中的任何类型) ,但 4
不是 Maybe Int
。如果你写 4 :: String
或 4 :: [Int]
或 4 :: Int -> Int
你会得到一个类似的类型错误。
Maybe Int
类型仅包含值
Nothing
Just 0
Just 1
Just -1
Just 2
Just -2
...
(还有一些底部,我省略了。)
值 4
不是 Maybe Int
类型的值。 Just 4
是这样的值之一。
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 a
的 Eq
实例中定义的,它是自动导入的,因为它在 Haskell Prelude
.
同样,Prelude
中也有一个Ord (Maybe a)
实例。此实例在 Maybe Int
之间定义 <
,因此 Nothing
是最小元素(<
任何其他元素),而两个值 Just x
和 Just y
根据是否x < y
.
所以,Nothing < Just 4
是正确的。
代码 Nothing<(4::Maybe Int)
给你一个错误,因为 4
是一个 Int
(从技术上讲,它是 Num
类型 class 中的任何类型) ,但 4
不是 Maybe Int
。如果你写 4 :: String
或 4 :: [Int]
或 4 :: Int -> Int
你会得到一个类似的类型错误。
Maybe Int
类型仅包含值
Nothing
Just 0
Just 1
Just -1
Just 2
Just -2
...
(还有一些底部,我省略了。)
值 4
不是 Maybe Int
类型的值。 Just 4
是这样的值之一。