2016-11-26 9 views
0

この関数を書いて、2つの整数の合計を計算し、それをintオプションの型として出力しました。しかし、私はこの警告を受ける。私はNoneのケースを定義しましたが、私はまだこれを取得します。誰も助けることができますか?Ocamlオプション機能

Error

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) 
+0

オーバーフローをチェックしようとしているようです。あなたがそれをやっているやり方はうまくいかない。例えば、 'x> max_int'は真ではありません。なぜなら、' max_int'は 'x'が持つことができる最大値ですからです。 'x>と' y'の両方が肯定的である場合、(例えば) 'x> max_int-y'をチェックすることができます。これは 'x + y> max_int'(両側で' y'を引く)なら真ですが、オーバーフローを避けます。 –

+0

このようにテストすることはできます x + y> max_int - 1? – 1XCoderX1

+0

いいえoff-by-oneエラーの他に、問題は 'max_int'が整数がOCamlに持つことができる最大値であるということです。加算がオーバーフローした場合、オーバーラップします。 'max_int + 1 = min_int'。これはあなたが特別に回避しなければならないものです(私が提案したアプローチは唯一のものではありませんが、正しいことを示す場合はおそらく最も簡単です)。 –

答えて

2

問題はここにあります。let add x (Some y) = ...です。 これは、第2引数がNoneでない場合にのみ、addを定義します。

+0

編集した機能を確認してください – 1XCoderX1

関連する問題