我正在编写一个程序集,其中包含一些用于处理数字基元的功能,即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
如何为数字原语创建这个通用名称?
答案 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#。