Неисчерпывающая ошибка в базовой функции Haskell - PullRequest
1 голос
/ 23 июня 2011

Я новичок в 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 ]

5 голосов
/ 23 июня 2011

Вы не завершили свою функцию eval.Например, предположим, я звоню eval (ConstInt 34).Что он должен вернуть?

Кроме того, подумайте, что находится в теле вашей функции.eval возвращает логическое значение, поэтому x и y будут логическими значениями, и вы проверяете, равны ли они.Это то, что вы хотите?

4 голосов
/ 23 июня 2011

При использовании сопоставления с образцом вы должны обработать все возможные случаи.

eval (Numequal e1 e2) = ...
eval _ = False -- or patterns for ConstInt, Ctrue and Cfalse
0 голосов
/ 23 июня 2011

Насколько я знаю, ваш тип данных должен быть deriving (Eq), чтобы вы могли сравнивать его.

...