OCaml

練習問題 3.15 関数の型

練習問題 3.15

以下の3つの型

  • int -> int -> int -> int
  • (int -> int) -> int -> int
  • (int -> int -> int) -> int

の違いを説明し、各型に属する適当な関数を定義しなさい。

(* 練習問題 3-15 *)

(* int -> int -> int -> int *)
let cube x = (fun y ->
              (fun z ->
                     x * y * z
              )
             );;

let test1 = cube 2 3 4 = 24;;
  
let daikei a b h = (a + b ) * h / 2;;

let test2 = daikei 2 3 4 = 10;;


  (* (int -> int) -> int -> int *)

let rec sum_of f n =
  if n = 0 then 0
  else
    sum_of f (n-1) + f n;;

let square x = x * x;;

let test3 = sum_of square 4 = 30;;

  (* (int -> int -> int) -> int *)
let sikaku a b = a * b;;

let test4 = sikaku 2 4 = 8;;

let risoku ritsu moto = moto *. ritsu;;

let test5 = risoku 0.03 1000. = 30.;;

let rec hukuri f ritsu moto years =
  if years = 0 then 0.
  else
    let moto = f ritsu moto +. moto in
    floor(hukuri f ritsu moto (years - 1) +. moto);;
  
let test6 = hukuri risoku 0.03 10000. 3 = 31836.;;

let cube x = x * x * x;;

let test7 = cube 2 = 8;;

let rec piramid f x h =
  if h = 0 then 0
  else
    piramid f x  (h-1) + (f x) * h * h;;

let test8 = piramid cube 2 4 = 240;;
              
let rec goukei f =
  (fun a ->
   (fun b -> 
    if b = 0 then 0
    else
      goukei f a (b-1) + f a b
   ));;
  
let rec rippo a b c =
  if c = 0 then 0
  else
    rippo a b (c-1) + sikaku a b * c;;
  
  
  
let add_one a b =
   sikaku a b + 1;;