gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:24:07 27 4
gpt4 key购买 nike

我有一个 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”的类型;对于大多数其他表达式,当一个类型没有被固定时,推理系统可以“ float 一个约束”,稍后可以解决这个问题,但对于这些情况,没有“具有名为 P 的属性的所有类型”形式的约束或'具有名为 M 的方法的所有类型(如鸭子类型),可以推迟并稍后解决。所以你现在需要这些信息,否则推理会立即失败。)

另见 overview of type inference in F# .

关于f# - 为什么 F# 的类型推断不能处理这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/844733/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com