再帰的な関数

再帰的な関数と定義するには rec をつける。

# let rec fact n = if n = 0 then 1 else n * fact (n - 1);;
val fact : int -> int = <fun>
# fact 3;;
- : int = 6
# fact 6;;
- : int = 720

あまり大きな整数は表現できないらしい。

# fact 30;;
- : int = -738197504

条件分岐

else は省略できない。

# let even n = if n mod 2 = 0 then true else false;;
val even : int -> bool = <fun>
# even 3;;
- : bool = false
# even 8;;
- : bool = true

ところで mod が中置演算子なのはへんな気分だ。

# 9 mod 3;;
- : int = 0
# (mod) 9 2;;
- : int = 1

関数の定義

これも let式を使う。

# let area_of_circle r = r *. r *. pi;;
val area_of_circle : float -> float = <fun>
# area_of_circle 1.0;;
- : float = 3.141529

引数の型を間違えないこと。

# area_of_circle 1;;
Characters 15-16:
area_of_circle 1;;
^
This expression has type int but is here used with type float

演算子

整数と実数で演算子が違う。

  • 整数: +, -, *, /
  • 実数: +., -., *., /.

間違えるとエラーになる。

# 1 + 2;;
- : int = 3
# 1.0 + 2.5;;
Characters 0-3:
1.0 + 2.5;;
^^^
This expression has type float but is here used with type int
# 1.0 +. 2.5;;
- : float = 3.5

文字列の連結

# "Hello," ^ " world.";;
- : string = "Hello, world."

文字列.[n] という書き方でn番目の文字を取得できる(先頭が0番目)。

# "Hello, world.".[0];;
- : char = 'H'
# "Hello, world.".[4];;
- : char = 'o'