基本Haskell函数中的非穷举错误

时间:2011-06-22 21:43:30

标签: haskell boolean non-exhaustive-patterns

我是Haskell的新手并尝试组合一个简单的函数来检查两个数字是否相等。这是编译,但是当我尝试对程序进行测试时,它说这不是详尽无遗的。我不明白它如何用布尔函数非穷举?提前致谢:

data Value = ConstInt Int
           | Numequal Value Value
           | Ctrue Bool
           | Cfalse Bool
            deriving (Read, Show)
eval:: Value -> Bool

eval (Numequal e1 e2) =
   let x = eval e1
       y = eval e2
         in case (x, y) of
            (i1, i2)  -> 
                if x == y
                then False
                else True

3 个答案:

答案 0 :(得分:5)

您尚未完成eval功能。例如,假设我呼叫eval (ConstInt 34)。它应该返回什么?

另外,请考虑功能正文中的内容。 eval会返回一个布尔值,因此xy都将是布尔值,您正在测试它们是否相等。那是你要的吗?

答案 1 :(得分:4)

使用模式匹配时,您必须处理所有可能的情况。

eval (Numequal e1 e2) = ...
eval _ = False -- or patterns for ConstInt, Ctrue and Cfalse

答案 2 :(得分:0)

据我所知,您的数据类型应为deriving (Eq),以便您能够对其进行比较。