gpt4 book ai didi

compiler-errors - 使用 List.sum 时类型约束不匹配

转载 作者:行者123 更新时间:2023-12-05 01:28:54 27 4
gpt4 key购买 nike

我可能已经离开 F# 太久了,但我希望它能编译:

module Calc

let foo values = List.sum values

相反,我得到一个编译错误:

FS0071 Type constraint mismatch when applying the default type 'obj' for a type
inference variable. The type 'obj' does not support the operator '+' Consider
adding further type constraints

这也发生在 List.average 上,所以起初我认为它与一般约束有关,例如需要成员 ( + ) 和成员 get_Zero,但是不能是全部,因为 let foo values = List.max values 编译(List.max 也有一个通用约束,尽管更简单 - 它只需要比较)。

我做错了什么?

这是一个 .NET 5.0 项目。在 Visual Studio 和 dotnet build 中编译均失败。

最佳答案

List.sum 有一个 SRTP 类型,要求列表的元素在其上定义了一个 (+) 运算符:

val sum:
list: list< ^T>
-> ^T (requires static member ( + ) and static member Zero )

当您在不知道列表元素类型的情况下尝试调用它时,编译器无法解析 SRTP。


一个选择是标记foo本身内联:

let inline foo values = List.sum values

这样,foo 本身将继承 SRTP 要求:

val foo:
values: list< ^a>
-> ^a (requires static member ( + ) and static member Zero )

而你只是把问题解决了 - 大概到了你知道元素类型的地步。

如果没有 inline 修饰符,这将不起作用,因为 SRTP 无法编译为 IL。


另一种选择,如果你负担得起的话,是指定一个元素类型,这样它就有一个 (+) 运算符:

let foo (values: int list) = List.sum values

这样,编译器可以通过观察 int 确实有一个 (+) 运算符来立即解析 SRTP。


这适用于 List.max,因为 max 没有 SRTP 约束。它只有一个受 IL 支持的 'T :> IComparison 约束,因此它们不必是 SRTP。

关于compiler-errors - 使用 List.sum 时类型约束不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68228076/

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