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

sdg*_*sdh 3 f#

我有一段这样的代码:

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

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

但是,如果我使用管道对代码重新排序,则它可以工作:

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

为什么是这样?

Che*_*usk 5

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