タプル型、レコード型 (F#)

タプル型の定義とか、レコード型の定義とか。

(* タプル値を定義 *)
let tup = (100, "hello")
(* タプルから要素を取得 *)
let num, str = tup
printfn "num = %d, str = %s" num str
(* タプル型をプリントする関数
   (引数 : 型 * 型) で引数にタプル型を指定できる
*)
let printTuple (t : int * string) =
  let n, s = t
  printfn "n = %d, s = %s" n s

printTuple tup
(* タプル型をちゃんと型定義 *)

type SampleTuple = int * string

let printTuple2 (t : SampleTuple) =
  let n, s = t
  printfn "n = %d, s = %s" n s

printTuple2 tup
(* レコード型 Person の定義
   タプルと違ってフィールド名が定義されている
*)
type Person = {
  name : string
  age  : int
}
(* Person の値を定義 *)
let moore = {
  new Person 
    with  name = "Gordon E. Moore" 
    and   age  = 78
}

printfn "name = %s; age = %d" moore.name moore.age
(* フィールド名がユニークな場合は次の省略記法が使える *)
let gates = { name = "Bill Gates"; age = 51 }
printfn "name = %s; age = %d" gates.name gates.age
(* Person のリストを作成 *)
let persons =
  [ { name = "Gordon E. Moore"; age = 78 };
    { name = "Bill Gates"; age = 51 };
    { name = "Linus Torvalds"; age = 38 }; ]
(* Person に対する pattern matching で検索 *)
let rec findByAge51 personList =
  match personList with
  | [] -> "not found"
  | { name = foundName; age = 51 } :: tail -> foundName
  | _ :: tail -> findByAge51 tail

printfn "found name is %s" (findByAge51 persons)