練習問題 7.2

整数リストの要素すべての積を返す関数 prod_list を定義しなさい。リスト要素にひとつでも 0 が含まれている場合には、prod_list の適用結果は常に 0 になるので、例外処理を利用して、0 を発見したら残りの計算を行わずに中断して 0 を返すように定義しなさい。

例外処理をおこなわずにふつうに書いたら、以下のようになるだろうな。

let prod_list l =
  let rec prod_list_in l e =
    match l with
      [] -> e
    | v :: rest ->
       if v = 0 then 0
       else prod_list_in rest (v * e)
  in
  prod_list_in l 1;;

今回は例外処理の勉強やから、例外処理を使うことにする。

解答

(* 例外の名前を Found_zero とする *)
exception Found_zero;;
  
let prod_list l =
  let rec prod_list_in l e =
    match l with
      [] -> e
    | v :: rest ->
       if v = 0 then raise Found_zero
       else prod_list_in rest (v * e)
  in
  try prod_list_in l 1 with Found_zero -> 0;;

(* 実行例 *)
let test1 = prod_list [2; 3; 4] = 24;;
let test2 = prod_list [2; -3; 4] = -24;;
let test3 = prod_list [2; 0; 4] = 0;;