如何编写通用 F# 函数来计算集合的平均值?我试过:
let inline mean x =
let length = x |> Seq.length
let sum = x |> Seq.sum
LanguagePrimitives.DivideByInt sum length
Run Code Online (Sandbox Code Playgroud)
这对于浮点数和小数似乎工作得很好,但令人惊讶的是,它不适用于int
错误提示The type 'int' does not support the operator 'DivideByInt'
.
首先,这个函数已经存在于 F# 中,并且被称为Seq.average
. 如果您这样做只是为了获得该功能,那么您现在可以停止阅读。如果您将此作为个人学习练习,请继续阅读。:-)
关于 DivideByInt 的 F# 文档在这里有答案:
如果类型支持 DivideByInt,则该类型支持精确除法(浮点除法),而不是整数除法,后者向下舍入到最接近的整数结果。
仅当元素类型支持精确除法时,Seq.average 等函数才有效。如果尝试将 Seq.average 与整数序列一起使用,则会收到一条错误,指示元素类型必须实现 DivideByInt。通常,您可以通过使用 Seq.averageBy 并向浮点值添加强制转换来解决此错误。
因此,要让您的mean
函数处理整数,您需要将其编写如下:
let intMean (x : int seq) =
let length = x |> Seq.length
let sum = x |> Seq.map float |> Seq.sum
LanguagePrimitives.DivideByInt sum length
Run Code Online (Sandbox Code Playgroud)