open System.Collections.Generic
type IDictionary<'TKey, 'TValue> with
member this.GetOrAdd (key:'TKey, fun':'TKey -> 'TValue) =
match this.ContainsKey key with
| true -> this.Item key
| false -> let val' = fun' key
this.Add (key, val')
val'
let dd =
let d = Dictionary()
d.Add (1, 2)
d.Add (3, 4)
d
printfn "%A" dd
dd.GetOrAdd (5, (fun x -> 2 * x)) |> printfn "%A :: %d" dd
dd.GetOrAdd (5, (fun x -> 9 * x)) |> printfn "%A :: %d" dd
b3BlbiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYwoKdHlwZSBJRGljdGlvbmFyeTwnVEtleSwgJ1RWYWx1ZT4gd2l0aAogICAgbWVtYmVyIHRoaXMuR2V0T3JBZGQgKGtleTonVEtleSwgZnVuJzonVEtleSAtPiAnVFZhbHVlKSA9CiAgICAgICAgbWF0Y2ggdGhpcy5Db250YWluc0tleSBrZXkgd2l0aAogICAgICAgICAgfCB0cnVlICAtPiB0aGlzLkl0ZW0ga2V5CiAgICAgICAgICB8IGZhbHNlIC0+IGxldCB2YWwnID0gZnVuJyBrZXkKICAgICAgICAgICAgICAgICAgICAgdGhpcy5BZGQgKGtleSwgdmFsJykKICAgICAgICAgICAgICAgICAgICAgdmFsJwoKbGV0IGRkID0KICAgIGxldCBkID0gRGljdGlvbmFyeSgpCiAgICBkLkFkZCAoMSwgMikKICAgIGQuQWRkICgzLCA0KQogICAgZAoKcHJpbnRmbiAiJUEiIGRkCmRkLkdldE9yQWRkICg1LCAoZnVuIHggLT4gMiAqIHgpKSB8PiBwcmludGZuICIlQSA6OiAlZCIgZGQKZGQuR2V0T3JBZGQgKDUsIChmdW4geCAtPiA5ICogeCkpIHw+IHByaW50Zm4gIiVBIDo6ICVkIiBkZAo=
seq [[1, 2]; [3, 4]]
seq [[1, 2]; [3, 4]; [5, 10]] :: 10
seq [[1, 2]; [3, 4]; [5, 10]] :: 10