インデックス付きプロパティ

Itemという特別な名前のプロパティを定義することで、 インデックス付きプロパティというものを定義することができます インデックス付きプロパティはname[index]という形でアクセスすることができます。 構文を示します。参考
インデックス付きプロパティの構文
// インデックス付きプロパティの参照 expr[idx] // インデックス付きプロパティの設定 expr[idx] <- elementExpr // 読み書き可能なインデックス付きプロパティの宣言 member self-identifier.Item with get(index-values) = get-member-body and set index-values values-to-set = set-member-body // 読み取り専用のインデックス付きプロパティの宣言 member self-identifier.Item with get(index-values) = get-member-body // 書き込み専用のインデックス付きプロパティの宣言 member self-identifier.Item with set index-values values-to-set = set-member-body
インデックス付きプロパティ
type JokeArray(ar : int array) = class
    let mutable data = ar
    member x.Item
        with get i = data[i-i%2]
        and set i v = data[i-i%2] <- v
    end;;
let a = new JokeArray([|0..9|]);;
//値の参照
for i in 0..9 do printfn "%d - %d" i a[i] done
printfn "";
//値の設定
a[7] <- 10;
//値の参照
for i in 0..9 do printfn "%d - %d" i a[i] done
//直接このように参照してもよい。この場合Item以外の名前でも良い
//for i in 0..9 do printfn "%d - %d" i (a.Item(i)) done
//a.Item(7) <- 12;;
インデックス付きプロパティ(軽量構文)
type JokeArray(ar : int array) =
    let mutable data = ar
    member x.Item
        with get i = data[i-i%2]
        and set i v = data[i-i%2] <- v

let a = new JokeArray([|0..9|])
//値の参照
for i in 0..9 do printfn "%d - %d" i a[i]
printfn ""
//値の設定
a[7] <- 10
//値の参照
for i in 0..9 do printfn "%d - %d" i a[i]
//直接このように参照してもよい。この場合Item以外の名前でも良い
//for i in 0..9 do printfn "%d - %d" i (a.Item(i))
//a.Item(7) <- 12
このプログラムは、奇数番目のデータを無視して 偶数番目と同じデータを返したり設定したりできる ジョークのような配列クラスJokeArrayの定義です。 値を設定できるようにするためには バッキングストアにmutableをつける必要があります。 Itemという名前のプロパティだけが特別に []でのアクセスを可能にしている点に注意が必要です。 上のプログラムでItemをGetなどの別の名前にすると[]が動作しなくなります。 ただし、その場合でも末尾にあるようにa.Get(i) <- 10のような使い方は可能ですが Foundations of F#によると、他の.Net Languageとの相互運用を考える場合 Item以外の名前にすると他の言語からこのクラスを使うことが難しくなるそうです。 []によるインデックスアクセスも出来るので、基本的にこの機能を利用する場合は Itemというプロパティ名にするのが良いと思います。