F# 计算平均值的通用函数

stt*_*106 5 f#

如何编写通用 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'.

rmu*_*unn 2

首先,这个函数已经存在于 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)