0
この関数を書いて、2つの整数の合計を計算し、それをintオプションの型として出力しました。しかし、私はこの警告を受ける。私はNoneのケースを定義しましたが、私はまだこれを取得します。誰も助けることができますか?Ocamlオプション機能
let add x (Some y) = match x with
|None -> if Some y = None then None
else Some y
|Some x ->
let z = x + y in
if z > max_int then None
else if z < min_int then None
else if (Some y) = None then Some x
else Some (x + y)
私はこれをしなかったが、まだ何かが欠けています。これはうまくいかない場合は誰も考えることができますか?
let add x y = match (x, y) with
| (None, None) -> None
| (Some x, None) -> None
| (None, Some y) -> None
| (Some x, Some y) -> if x > max_int then None
else if x < 0 then None
else if y < 0 then None
else if x + y > max x y then None
else if x + y < min x y then None
else if y > max_int then None
else if x < min_int then None
else if y < min_int then None
else if x + y >= max_int then None
else if x + y <= min_int then None
else Some (x + y)
オーバーフローをチェックしようとしているようです。あなたがそれをやっているやり方はうまくいかない。例えば、 'x> max_int'は真ではありません。なぜなら、' max_int'は 'x'が持つことができる最大値ですからです。 'x>と' y'の両方が肯定的である場合、(例えば) 'x> max_int-y'をチェックすることができます。これは 'x + y> max_int'(両側で' y'を引く)なら真ですが、オーバーフローを避けます。 –
このようにテストすることはできます x + y> max_int - 1? – 1XCoderX1
いいえoff-by-oneエラーの他に、問題は 'max_int'が整数がOCamlに持つことができる最大値であるということです。加算がオーバーフローした場合、オーバーラップします。 'max_int + 1 = min_int'。これはあなたが特別に回避しなければならないものです(私が提案したアプローチは唯一のものではありませんが、正しいことを示す場合はおそらく最も簡単です)。 –