1

私はHaskellを初めて使用し、2つの数値が等しいかどうかをチェックするための簡単な関数をまとめようとしています。これはコンパイルされますが、プログラムのテストを試してみると、これは網羅的ではないと表示されます。ブール関数でどのように網羅的でないのかわかりませんか?前もって感謝します:

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
4

3 に答える 3

5

あなたはあなたのeval機能を終えていません。たとえば、を呼び出すとしますeval (ConstInt 34)。何を返す必要がありますか?

また、関数の本体に何があるかを考えてください。evalブール値を返すので、xyは両方ともブール値になり、それらが等しいかどうかをテストしています。それはあなたが望むものですか?

于 2011-06-22T22:03:28.433 に答える
4

パターンマッチングを使用する場合は、考えられるすべてのケースを処理する必要があります。

eval (Numequal e1 e2) = ...
eval _ = False -- or patterns for ConstInt, Ctrue and Cfalse
于 2011-06-22T21:58:18.580 に答える
0

私の知る限り、あなたのデータ型はderiving (Eq)あなたがそれを比較できるようにするためのものでなければなりません。

于 2011-06-22T21:53:26.977 に答える