【问题标题】:F#, small type inference / annotation errorF#,小类型推断/注释错误
【发布时间】:2015-08-04 20:59:19
【问题描述】:

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

  let daysList = List.map (fun x -> x.Day) datesList

但智能感知显示 x 是 DateTime 类型(在“有趣的 x”处)。并且该 datesList 是 DateTime 列表类型。所以我很困惑为什么我必须像这样声明 x 的类型,然后一切正常:

  let daysList = List.map (fun (x:System.DateTime) -> x.Day) datesList

【问题讨论】:

    标签: datetime types f# type-inference


    【解决方案1】:

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

    let daysList = datesList |> List.map (fun x -> x.Day)
    

    那么,为什么 IntelliSense 可以确定 xDateTime?打败我,但根据我的经验,IntelliSense 有时不同意编译器是很常见的。

    顺便说一句,从左到右的规则似乎也不总是严格的。在我把一切都做好之前,我经常需要进行一些试验。

    【讨论】:

    • 谢谢。我可能开始掌握这个窍门了。
    • 如果我没记错的话:访问方法或属性时始终需要从左到右的顺序。访问记录字段时也有必要除非记录类型在范围内(来自同一模块或opened 模块)并且没有其他记录类型具有具有相同名称的字段在两者之间定义(类型推断将优先选择最接近的记录类型)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    相关资源
    最近更新 更多