为什么在这里类型推断仅适用于管道?

时间:2019-05-20 16:56:11

标签: f#

我有一段这样的代码:

let! deliveries = 
  async {
    match Option.map (fun x -> x.Address) maybeUser with
    | Some "" -> return []
    | Some address -> return! fetchDeliveries address
    | None -> return []
  }

对此的类型推断在x.Address处失败。

但是,如果我使用管道对代码重新排序,那么它会起作用:

let! deliveries = 
  async {
    match maybeUser |> Option.map (fun x -> x.Address) with
    | Some "" -> return []
    | Some address -> return! fetchDeliveries address
    | None -> return []
  }

这是为什么?

1 个答案:

答案 0 :(得分:5)

这是因为F#的编译器是一个单通道,自上而下,从左至右的编译器。因此,在对文件进行类型检查时,表达式左侧的任何类型信息都可用于验证右侧。 |>示例起作用的原因是,左侧具有确定的类型(在这种情况下,您已经定义了某种User option类型,它告诉Option.map是传入的项是User option,因此您传入的lambda函数必须为User -> something else类型,当然是。

相关问题