创建适用于所有数字基元的函数

时间:2015-01-22 15:40:49

标签: f#

我正在编写一个程序集,其中包含一些用于处理数字基元的功能,即float,int,decimal等。

其中一个函数采用两个序列并计算两者的运行平均值。浮点数的实现可能如下所示

let average x y = (x+y)/2.
let a = [1..10] |> List.map float
let b = List.rev [1..10] |> List.map float
let result = (a, b) ||> List.map2 average

如何为数字原语创建这个通用名称?

1 个答案:

答案 0 :(得分:3)

F#有所谓的"静态成员约束"可用于编写通用数字代码。这仅限于F#(因为.NET没有这样的概念)。

通常,您需要将该功能标记为inline。这将使函数内的标准运算符表现为通用运算符。此外,您需要避免使用常量(如2.0)。您通常可以使用LanguagePrimitives模块中的某些操作替换它们。例如,您的average函数可以使用:

编写为通用函数
let inline average x y = 
  LanguagePrimitives.DivideByInt (x + y) 2

了解更多信息check out this blog post about generic numeric computations in F#