我有一段这样的代码:
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 []
}
这是为什么?
答案 0 :(得分:5)
这是因为F#的编译器是一个单通道,自上而下,从左至右的编译器。因此,在对文件进行类型检查时,表达式左侧的任何类型信息都可用于验证右侧。 |>
示例起作用的原因是,左侧具有确定的类型(在这种情况下,您已经定义了某种User option
类型,它告诉Option.map
是传入的项是User option
,因此您传入的lambda函数必须为User -> something else
类型,当然是。