此问题在此处已有答案:
Why is GHC complaining about non-exhaustive patterns?(3个答案)
四个月前关门了。
我对Haskell还不熟悉
data Tree a = Leaf | Branch (Tree a) a (Tree a)
deriving (Show, Eq)
insert :: (Ord a, Eq a) => a -> Tree a -> Tree a
insert x Leaf = Branch Leaf x Leaf
insert x (Branch l v r)
| x <= v = Branch (insert x l) v r
| x > v = Branch l v (insert x r)
程式码会给出下列警告(但会编译):
app\Main.hs:10:1: warning: [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for `insert':
Patterns not matched:
_ (Branch Leaf _ Leaf)
_ (Branch Leaf _ (Branch _ _ _))
_ (Branch (Branch _ _ _) _ Leaf)
_ (Branch (Branch _ _ _) _ (Branch _ _ _))
|
10 | insert x Leaf = Branch Leaf x Leaf
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
从技术上讲,x <= v
和x > v
应该涵盖所有可能的替代方案,但我有这个警告。如果我在第二种情况下使用otherwise
,我实际上是固定的,但它不应该像这样工作吗?
1条答案
按热度按时间kokeuurv1#
一个
Ord
示例 * 应该 * 定义一个总订单,但是Haskell不能将其作为一个要求来强制执行,也不能检测一个Ord
示例是否确实是一个总订单。使用
otherwise
并不是因为当x <= v
是False
时它是True
(根据字面定义,它确实是True
),而是因为它是True
* 而不管 *x <= v
是真还是假。知道<=
和>
每个 * 都可以 * 返回True
并不保证它们中的一个 * 会 *。