練習問題 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);;