F#,小型推理/注释错误

Rom*_*eEE 2 f# datetime types type-inference

F#中的这一行给出了在"x.Day"处可能需要类型注释的错误.

  let daysList = List.map (fun x -> x.Day) datesList
Run Code Online (Sandbox Code Playgroud)

但intellisense显示x的类型为DateTime(在"fun x"处).而且datesList的类型是DateTime列表.所以我很困惑为什么我必须像这样声明x的类型然后一切正常:

  let daysList = List.map (fun (x:System.DateTime) -> x.Day) datesList
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 5

F#编译器通常更喜欢从左到右推断类型,所以如果使用管道运算符编写它,它可以工作,假设它datesListDateTime list:

let daysList = datesList |> List.map (fun x -> x.Day)
Run Code Online (Sandbox Code Playgroud)

那么,为什么IntelliSense可以确定这x是一个DateTime?打败我,但根据我的经验,IntelliSense有时不同意编译器是相当普遍的.

顺便说一句,从左到右的规则似乎并不总是严格的.在我把一切都搞定之前,我经常要做一些实验.