このエラーは、それが何を言っているかを正確に意味しています。
まず、ハスケルは何を期待しましたか?
IVal (something)
HaskellはValue
のあなたの定義は、それがあるべきと言ったので、something
はInteger
ことを期待:すべての
data Value
= IVal Integer
| BVal Bool
第二に、Haskellは何を推測するのですか?
(IVal (eval c x)) + (IVal (eval c (Prim IntAddOp xs)))
私はあなたがそうでなければ+
が動作しない、Value
秒間Num
インスタンスを定義したと仮定しなければなりません。したがって、Value
をValue
に追加すると、結果はValue
になるはずです。だから、Haskellは、この式はタイプValue
を持っていることを推測
(私はIVal
がValue
型のコンストラクタであるため、追加されている2つのものがValues
であることを知っています)。
なぜ一致しませんか?
ハスケルはInteger
という表現を期待しており、それにValue
という表現を付けました。エラーは、それが言うことを正確に意味します。どのようにそれを修正するには?まあ、私はヒントはありません。暗闇の中で刺すと、追加からコンストラクタIVal
を削除することができます。
((eval c x) + (eval c (Prim IntAddOp xs)))
ちょっと待っては、eval
の結果はValue
、ないInteger
ので、...我々はまだValues
を追加し、IVal
でこれらをラッピングしていると、それは以前よりもさらに多くの間違っています。
IVal
のうちInteger
を取得する関数を定義することはどうでしょうか。私はあなたがBVal
の上で未定義のextract
を残す、またはエラー、または何をスローする場合があります1または0として処理するブール値の恐ろしいC-のような規則を使用しています。ここ
extract :: Value -> Integer
extract (IVal x) = x
extract (BVal True) = 1
extract (BVal False) = 0
。少なくとも今、Value
からInteger
を抽出する方法があります。
だから今、私はあなたが実際にがValue
ためNum
インスタンスを持っていないと仮定しています。それら2つの式を一緒に追加するために、その2つの式のうちIntegers
を抽出しましょう。
(extract (eval c x) + extract (eval c (Prim IntAddOp xs)))
は今
ことは
Integer
と推定されなければなりません。そこで、それを
IVal
コンストラクタでラップすることができます。
IVal (extract (eval c x) + extract (eval c (Prim IntAddOp xs)))
問題が解決しましたか?