我有一个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
?
答案 0 :(得分:24)
类型推断从左到右工作。这是管道运营商的用武之地;如果你已经知道'fis'的类型,那么把它写成
fis |> Seq.map (fun fi -> fi.Name)
,推理适合你。
(一般来说,表格的表达方式
o.Property
o.Method args
要求'o'类型为先验;对于大多数其他表达式,当一个类型没有固定下来时,推理系统可以“浮动一个约束”,这可以在以后解决,但对于这些情况,没有形式'所有类型与名为P'的属性的约束或'所有类型都有一个名为M'的方法(如鸭子打字),可以推迟并在以后解决。因此,您现在需要该信息,或者推理立即失败。)