使用運算子在 F 中進行後期繫結

在像 F# 這樣的靜態型別語言中,我們使用在編譯時熟知的型別。我們使用型別提供程式以型別安全的方式使用外部資料來源。

然而,偶爾需要使用後期繫結(如 C# 中的 dynamic)。例如,使用沒有明確定義架構的 JSON 文件時。

為了簡化後期繫結的工作,F# 提供了支援動態查詢操作符 ??<-

例:

// (?) allows us to lookup values in a map like this: map?MyKey
let inline (?)   m k   = Map.tryFind k m
// (?<-) allows us to update values in a map like this: map?MyKey <- 123
let inline (?<-) m k v = Map.add k v m

let getAndUpdate (map : Map<string, int>) : int option*Map<string, int> =
  let i = map?Hello       // Equivalent to map |> Map.tryFind "Hello"
  let m = map?Hello <- 3  // Equivalent to map |> Map.add "Hello" 3
  i, m

事實證明,F# 對後期繫結的支援簡單而靈活。