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