練習問題 6.4

上の monus 関数を改造して、引き算の答えが負になるような場合には None を返す nat -> nat -> nat option 型の関数 minus を定義しなさい。

以下は、練習問題 6.3 の解答である。

type nat = Zero | OMT of nat;;  (* OMT -- OneMoreThan *)

let zero = Zero
and one = OMT Zero
and two = OMT (OMT Zero);;

let three = OMT two;;
let four = OMT three;;
let five = OMT four;;
let six = OMT five;;

  
(* 引き算 *)
let rec monus m n =
  match (m, n) with
    (Zero, _) -> zero
  | (_, Zero) -> m
  | (OMT m', OMT n') -> monus m' n';;

練習問題 6.4 の答え

let rec minus m n =
  match (m, n) with
    (Zero, _) -> None 
  | (_, Zero) -> Some m
  | (OMT m', OMT n') -> minus m' n';;
# minus six two;;
- : nat option = Some (OMT (OMT (OMT (OMT Zero))))
# minus two six;;
- : nat option = None