union type (F#)
"Foundations of F#" には "union type" って書いてあるんだけど、日本語訳すると何になるんだろう?
(* ジャンケン型 列挙型(enum)のように定義できる *) type Janken = Goo | Choki | Pah let janken = Choki printfn "%A" janken // "Choki" と表示
(* Janken 型のパターンマッチング *) let jankenPon a b = match (a, b) with | (Goo, Choki) | (Choki, Pah) | (Pah, Goo) -> "win" | (Choki, Goo) | (Pah, Choki) | (Goo, Pah) -> "lose" | _ -> "draw" printfn "janken = %s" (jankenPon Goo Choki) // "win" と表示 printfn "janken = %s" (jankenPon Pah Pah) // "draw" と表示
(* float ベースの角度型 *) type Angle = | Degree of float | Radian of float (* Angle値の定義 *) let angle1 = Degree 90.0 let angle2 = Radian (0.5 * System.Math.PI)
(* Angle型から degree 値を取得する関数 *) let getDegree (angle : Angle) = match angle with | Degree deg -> deg | Radian rad -> rad * 180.0 / System.Math.PI (* Angle型から radian 値を取得する関数 *) let getRadian (angle : Angle) = match angle with | Degree deg -> deg * System.Math.PI / 180.0 | Radian rad -> rad (* angle1 と angle2 の degree 値と radian 値をそれぞれ出力 *) printfn "angle1 = %f [deg]" (getDegree angle1) printfn "angle2 = %f [deg]" (getDegree angle2) printfn "angle1 = %f [rad]" (getRadian angle1) printfn "angle2 = %f [rad]" (getRadian angle2)
(* 二分木の定義 - 'a はパラメタライズされた型 - 再帰的な型定義 *) type BinaryTree<'a> = | BinaryNode of BinaryTree<'a> * BinaryTree<'a> | BinaryLeaf of 'a (* 二分木の構築 *) let tree = BinaryNode( BinaryNode (BinaryLeaf 1, BinaryLeaf 2), BinaryNode (BinaryLeaf 3, BinaryNode (BinaryLeaf 4, BinaryLeaf 5)))
(* 二分木を出力する関数 *) let rec printBinaryTree tree = match tree with | BinaryNode (t1, t2) -> printBinaryTree t1 printBinaryTree t2 | BinaryLeaf value -> printfn "value = %A" value printBinaryTree tree