練習問題 3.2 〜 3.5 は、よくわからないので、パス。

練習問題 3.6

次の関数を定義せよ。

① 2実数の相乗平均をとる関数 geo_mean(x と y の相乗平均はルート(x・y)です。

(* 練習問題 3.6 *)

let geo_mean (x, y) = sqrt(x *. y);;

       (* TEST *)
let test1 = geo_mean (2., 8.) = 4.;;

② 名前(文字列)、身長(実数)、体重(実数)の組を受け取って、BMI指数に従って、「◯◯さんはやせています」「◯◯さんは肥満です」などのメッセージを返す関数 bmi。なお、BMI指数は次の計算式で計算できます。

BMI指数 = 体重(kg)/ 身長(m)の2乗

また、BMI指数の意味は、

BMI指数状態
18.5未満やせ
18.5 以上 25 未満標準
25 以上 30 未満肥満
30 以上高度肥満

ということです。

let person1 = ("Sato", 170.5, 68.0)
let person2 = ("Suzuki", 156.5, 75.5)
let person3 = ("Kimura", 180.0, 78.0)
let nukayama = ("Seiichi", 170.0, 68.5)

let (name, height, weight) = person1;;
let (name, height, weight) = person2;;
let (name, height, weight) = person3;;
let (name, height, weight) = nukayama;;

(*
  bmi: String, float, float => String
 *)
let bmi (name, height, weight) =
  let bmiLevel = weight /. ((height /. 100.) *. (height /. 100.)) in
  if (bmiLevel < 18.5)
  then name ^ "さんはやせています。"
  else
    if (bmiLevel >= 25. && bmiLevel < 30.)
    then name ^ "さんは肥満です。"
    else
      if (bmiLevel >= 30.)
      then name ^ "さんは高度肥満です。"
      else
        name ^ "さんは標準です。"

③ 任意の整数 x, y に対し、f ( sum_and_diff ( x, y )) が (x, y ) を返すような関数 f。

(* 練習問題3.6 3 *)

let x = 5;;
let y = 3;;
let sum_and_diff = (x + y, x - y);;
let f(x, y) =
    let sum_and_diff = (x + y, x - y) in
    let (left, right) = sum_and_diff in
    (left - y, right - x + y + y);;