繁体   English   中英

为什么F#的类型推断不能处理这个?

[英]Why can't F#'s type inference handle this?

我有一个FileInfo序列,但我只关心它们的字符串名称,所以我想要一个字符串序列。 起初我尝试过这样的事情:

Seq.map (fun fi -> fi.Name) fis

但由于某种原因,F#的类型推断不足以允许这样做,并让我明确地给“fi”类型:

Seq.map (fun (fi : FileInfo) -> fi.Name) fis

为什么需要这个注释? 如果知道fis : seq<FileInfo>和那个Seq.map : ('a -> 'b) -> seq<'a> -> seq<'b> ,那么它不应该推断出类型lambda表达式是FileInfo -> 'b ,然后,从fi.Name : string ,进一步推断它的类型是FileInfo -> string

类型推断从左到右工作。 这是管道运营商的用武之地; 如果你已经知道'fis'的类型,那么把它写成

fis |> Seq.map (fun fi -> fi.Name)

推理适合你。

(一般来说,表格的表达方式

o.Property
o.Method args

要求'o'的类型先验已知; 对于大多数其他表达式,当一个类型没有固定下来时,推理系统可以“浮动一个约束”,这可以在以后解决,但对于这些情况,没有形式'所有类型与名为P'的属性的约束或'所有类型都有一个名为M'的方法(如鸭子打字),可以推迟并在以后解决。 所以你现在需要这些信息,或者推理立即失败。)

另请参阅F#中的类型推断概述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM