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

F# 为什么类型推断在这里只适用于管道?,f#,F#,我有一段代码如下: let!交货= 异步的{ 将Option.map(fun x->x.Address)与用户匹配 |有些“->”返回[] |某些地址->返回!获取地址 |无->返回[] } 在x.Address处,对该地址的类型推断失败 但是,如果我使用管道对代码进行重新排序,它将正常工作: let!交货= 异步的{ 将maybeUser |>Option.map(fun x->x.Address)与 |有些“->”返回[] |某些地址->返回!获取地址 |无->返回[] } 这是为什么?

我有一段代码如下:

let!交货=
异步的{
将Option.map(fun x->x.Address)与用户匹配
|有些“->”返回[]
|某些地址->返回!获取地址
|无->返回[]
}
x.Address
处,对该地址的类型推断失败

但是,如果我使用管道对代码进行重新排序,它将正常工作:

let!交货=
异步的{
将maybeUser |>Option.map(fun x->x.Address)与
|有些“->”返回[]
|某些地址->返回!获取地址
|无->返回[]
}
这是为什么?

这是因为F#的编译器是一个单通道、自上而下、从左到右的编译器。因此,在对文件进行类型检查时,可以使用表达式左侧的任何类型信息来验证右侧。
|>
示例之所以有效,是因为左侧有一个确定的类型(在本例中,您定义了某种类型的
User option
类型,它告诉
option.map
是的,进入的项目是
用户选项
,因此您传入的lambda函数必须是
User->其他类型
,当然是这样。

注意
option.map(fun x->x.Address)只要包含
用户
类型的模块打开且没有歧义,maybeUser
仍可工作。