使用运算符在 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# 对后期绑定的支持简单而灵活。