首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么F#的类型推断不能处理这个问题?

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

Stack Overflow用户
提问于 2009-05-10 05:07:34
回答 1查看 975关注 0票数 13

我有一个FileInfo序列,但我只关心它们的字符串名称,所以我想要一个字符串序列。一开始,我尝试了这样的方法:

代码语言:javascript
复制
Seq.map (fun fi -> fi.Name) fis

但是由于某些原因,F#的类型推断不足以允许这样做,并使我显式地为“fi”指定了一个类型:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-05-10 05:21:12

类型推断从左到右工作。这就是管道运算符的用处;如果您已经知道“fis”的类型,则将其编写为

代码语言:javascript
复制
fis |> Seq.map (fun fi -> fi.Name)

这个推论对你有效。

(通常,以下形式的表达式

代码语言:javascript
复制
o.Property
o.Method args

要求'o‘的类型是先验已知的;对于大多数其他表达式,当一个类型没有被固定住时,推理系统可以’浮动一个约束‘,这个约束可以在以后解决,但对于这些情况,没有’具有名为P的属性的所有类型‘或’具有名为M的方法的所有类型‘形式的约束(如鸭子类型),可以推迟并在以后解决。因此,您现在就需要该信息,否则推理将立即失败。)

另请参阅overview of type inference in F#

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/844733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档