> type t = Hoge of int * int;;
type t = | Hoge of int * int
> let tpl = 1, 2;;
val tpl : int * int = (1, 2)
> Hoge tpl;;
val it : t = Hoge (1,2)
> let (Hoge tpl) = it;;
let (Hoge tpl) = it;;
-----^^^^^^^^
stdin(5,6): error FS0019: このコンストラクターには 1 個の引数が適用されていますが、必要なのは 2 個です
enum
の定義としてtype Modes = LightMode | StandardMode | ...
としていますが、これだとenum
ではなく判別共用体(すべてのケースが値を持たない判別共用体)になります。
enum
はすべての値を=
で指定する必要があります。
Item1
やItem2
によるアクセスはできません
System.Tuple<...>
で表されてはいるのですが、別物と考えておいた方が色々といいかもしれません。
type 'a list =
| []
| (::) of 'a * 'a list
( <op> )
のようにして関数化可能ですが、どちらも不可能です
:?
はパターン、[| ... |]
は配列式を構成する文法です
次に複数の値を持ったケースを持つ判別共用体の定義方法ですが、
// タプルで定義
type Node =
| Element of (string * (Node seq))
| Text of string
// タプルを使わずに定義
type Node =
| Element of string * Node seq
| Text of string
の2種類があって、後者の方がより効率的な型を生成します。
match
式でタプルとして受け取れない、というものがあります。