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
takatoh's blog – Learning programming languages.
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
2つ(あるいはそれ以上)の関数を and でつないでいっぺんに定義できるがおもしろい。
and の後の関数には let rec が要らない。
# let rec even n = if n = 0 then true else odd (n - 1) and odd n = if n = 0 then false else even (n - 1) ;; val even : int -> bool = <fun> val odd : int -> bool = <fun> # even 3;; - : bool = false # even 4;; - : bool = true # odd 5;; - : bool = true # odd 8;; - : bool = false
プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~ p.51より。再帰的に定義する。
# let rec euclid m n = if m = n then m else if m > n then euclid n m else euclid (n - m) m ;; val euclid : int -> int -> int = <fun> # euclid 12 60;; - : int = 12 # euclid 12 6;; - : int = 6
基本的には m≦n のつもりで書いているけど,n – m と m の大小関係は決定できないので3行目を入れた。これで m と n の大小関係も気にしなくて済んでいる。
これも 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
let式を使う。
# let pi = 3.141529;; val pi : float = 3.141529 # pi;; - : float = 3.141529
整数と実数で演算子が違う。
間違えるとエラーになる。
# 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'
こないだ買ったOCamlの本プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~を少しずつ読んでいる。
まずは基本的な型:
プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~