我有一个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>,那么它不应该推断λ表达式类型是FileInfo -> 'b,然后从fi.Name : string进一步推断它的类型是FileInfo -> string
发布于 2009-05-10 05:21:12
类型推断从左到右工作。这就是管道运算符的用处;如果您已经知道“fis”的类型,则将其编写为
fis |> Seq.map (fun fi -> fi.Name)这个推论对你有效。
(通常,以下形式的表达式
o.Property
o.Method args要求'o‘的类型是先验已知的;对于大多数其他表达式,当一个类型没有被固定住时,推理系统可以’浮动一个约束‘,这个约束可以在以后解决,但对于这些情况,没有’具有名为P的属性的所有类型‘或’具有名为M的方法的所有类型‘形式的约束(如鸭子类型),可以推迟并在以后解决。因此,您现在就需要该信息,否则推理将立即失败。)
另请参阅overview of type inference in F#。
https://stackoverflow.com/questions/844733
复制相似问题