haskell 模式匹配不正确[重复]

z18hc3ub  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(148)

此问题在此处已有答案

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 <= vx > v应该涵盖所有可能的替代方案,但我有这个警告。如果我在第二种情况下使用otherwise,我实际上是固定的,但它不应该像这样工作吗?

kokeuurv

kokeuurv1#

一个Ord示例 * 应该 * 定义一个总订单,但是Haskell不能将其作为一个要求来强制执行,也不能检测一个Ord示例是否确实是一个总订单。

Prelude> data Foo = A | B deriving Eq
Prelude> instance Ord Foo where _ <= _ = False; _ > _ = False
Prelude> A <= B
False
Prelude> A > B
False

使用otherwise并不是因为当x <= vFalse时它是True(根据字面定义,它确实是True),而是因为它是True * 而不管 * x <= v是真还是假。知道<=>每个 * 都可以 * 返回True并不保证它们中的一个 * 会 *。

相关问题