演算子のオーバーロード #2

F#の ?<- 演算子(動的プロパティに値を設定する演算子)はわりとキモいことがわかってきた。

まずはこんな感じでグローバルな演算子を定義してみる。

let (?<-) (d:#IDictionary<'K, 'V>) k v = d.[k] <- v

まず、キーとして適当な判別共用体を食わせてみる。

type MyUnion = A | B | C of int

let testUnion =
    let d = new Dictionary<MyUnion, int>()
    let k = C 12
    d.[k] <- 1

    d?(k) <- 2
    d?(C 12) <- 3

    printfn "%A" (d.[k])

出力は想像通り、 3 になる。 まあそれはいい。

次に、キーとして文字列を食わせてみる。

let testString = 
    let d = new Dictionary<string, int>()
    let k = "foo"
    d.[k] <- 1

    d?(k) <- 2
    d?foo <- 3

    printfn "%A" (d.[k])

エラーは出ず、出力は 3 になる。

d?foo は、C#で言うところのdynamic型みたいな感じで、文字列として書いてなくても文字列としてコンパイルされるということのようだ。キモいけど、なんとかわかった。 (続く)