《プログラミングの基礎》をReScriptで読む 第五章

[《プログラミングの基礎》](https://www.amazon.co.jp/dp/4781911609/ "Amazonへのリンク")はとても良い本です。
サンプルプログラムをReScriptで書いて、プログラミングの基礎とReScriptを学びます。
# 環境
* macOS Sonoma(バージョン 14.4.1)
* ReScript 11.1.0-rc.8
* @rescript/core 1.2.0
# 第五章
if式がif文として解説されています。
ReScriptのif式は`if condition {expression1} else {expression2}`です。
`else if`について公式ドキュメントで言及を見つけられないのですが、`else {if }`のシンタックス・シュガーとして`else if`が使えているようです。
```ReScript:ex05_1.res
// 目的：時間を受け取ったら午前か午後かを返す
// jikan : int -> string
let jikan = (ji) => if ji < 12 {"午前"} else {"午後"}

// テスト
Console.log(jikan(0) == "午前") 
Console.log(jikan(3) == "午前") 
Console.log(jikan(12) == "午後") 
Console.log(jikan(15) == "午後")
Console.log(jikan(21) == "午後")
```
```ReScript:ex05_3.res
// 目的：月と日を受け取ってきたら星座を返す
// seiza : int -> int -> string

let seiza = (tsuki, hi) => {
  if tsuki == 1 {
    if 1 <= hi && hi <= 19 {"山羊座"} 
	else if 20 <= hi && hi <= 31 {"水瓶座"} 
	else {"なし"}
  } else if tsuki == 2 {
    if 1 <= hi && hi <= 18 {"水瓶座"} 
	else if 19 <= hi && hi <= 29 {"魚座"} 
	else {"なし"}
  } else if tsuki == 3 {
    if 1 <= hi && hi <= 20 {"魚座"}
	else if 21 <= hi && hi <= 31 {"牡羊座"} 
    else {"なし"}
  } else if tsuki == 4 {
    if 1 <= hi && hi <= 19 {"牡羊座"} 
	else if 20 <= hi && hi <= 30 {"牡牛座"} 
    else {"なし"} 
  } else if tsuki == 5 {
    if 1 <= hi && hi <= 20 {"牡牛座"} 
	else if 21 <= hi && hi <= 31 {"双子座"} 
    else {"なし"} 
  } else if tsuki == 6 {
    if 1 <= hi && hi <= 21 {"双子座"} 
	else if 22 <= hi && hi <= 30 {"蟹座"} 
    else {"なし"}
  } else if tsuki == 7 {
    if 1 <= hi && hi <= 22 {"蟹座"} 
	else if 23 <= hi && hi <= 31 {"獅子座"} 
    else {"なし"}
  } else if tsuki == 8 {
    if 1 <= hi && hi <= 22 {"獅子座"}
	else if 23 <= hi && hi <= 31 {"乙女座"} 
    else {"なし"}
  } else if tsuki == 9 {
    if 1 <= hi && hi <= 22 {"乙女座"}
	else if 23 <= hi && hi <= 30 {"天秤座"} 
	else {"なし"} 
  } else if tsuki == 10 {
    if 1 <= hi && hi <= 23 {"天秤座"}
    else if 24 <= hi && hi <= 31 {"蠍座"} 
    else {"なし"}
  } else if tsuki == 11 {
    if 1 <= hi && hi <= 21 {"蠍座"} 
	else if 22 <= hi && hi <= 30 {"射手座"} 
    else {"なし"}
  } else if tsuki == 12 {
    if 1 <= hi && hi <= 21 {"射手座"} 
	else if 22 <= hi && hi <= 31 {"山羊座"}
    else {"なし"}
  } else {
    "なし"
  }
}

// テスト
Console.log(seiza(6, 11) == "双子座") 
Console.log(seiza(6, 30) == "蟹座")
Console.log(seiza(9, 17) == "乙女座") 
Console.log(seiza(10, 7) == "天秤座")
```
```ReScript:ex05_456.res
// 問題 5.4
// 目的：a, b, c を受け取ったら判別式の値を返す
// hanbetsushiki : float -> float -> float -> float
let hanbetsushiki = (a, b, c) => b *. b -. 4.0 *. a *. c 
 
// テスト
Console.log(hanbetsushiki(1.0, 5.0, 4.0) == 9.0) 
Console.log(hanbetsushiki(2.0, (-4.0), 2.0) == 0.0) 
Console.log(hanbetsushiki(1.0, 2.0, 4.0) == -12.0)

// 問題 5.5
// 目的：a, b, c を受け取ったら解の個数を返す
// kai_no_kosuu : float -> float -> float -> int
let kai_no_kosuu = (a, b, c) =>
  if hanbetsushiki(a, b, c) > 0.0 {2}
  else {
    if hanbetsushiki(a, b, c) == 0.0 {1}
    else {0}
  } 
 
// テスト
Console.log(kai_no_kosuu(1.0, 5.0, 4.0) == 2) 
Console.log(kai_no_kosuu(2.0, (-4.0), 2.0) == 1) 
Console.log(kai_no_kosuu(1.0, 2.0, 4.0) == 0) 

// 問題 5.6
// 目的：a, b, c を受け取ったら虚数解を持つかを判定する
// kyosuukai : float -> float -> float -> bool
let kyosuukai = (a, b, c) => hanbetsushiki(a, b, c) < 0.0
 
Console.log(kyosuukai(1.0, 5.0, 4.0) == false) 
Console.log(kyosuukai(2.0, (-4.0), 2.0) == false) 
Console.log(kyosuukai(1.0, 2.0, 4.0) == true) 
```
```ReScript:ex05_07.res
// 問題 4.4
let bmi = (shincho, taiju) => { 
  taiju /. (shincho *. shincho)
}

// 問題 5.7
// 目的：身長と体重を受け取ったら体型を返す
// taikei : float -> float -> string
let taikei = (shincho, taiju) => 
  if bmi(shincho, taiju) < 18.5 {"やせ"} 
  else if bmi(shincho, taiju) < 25.0 {"標準"} 
  else if bmi(shincho, taiju) < 30.0 {"肥満"} 
  else {"高度肥満"}
 
// テスト
Console.log(taikei(1.13, 20.0) == "やせ") 
Console.log(taikei(1.63, 57.0) == "標準")
Console.log(taikei(1.71, 56.0) == "標準")
```