创建适用于所有数字基元的函数
Creating a function that works for all numeric primitives
我正在编写一个程序集,其中包含一些旨在处理数字基元(即 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
我怎样才能使这个通用的数字基元?
F# 有所谓的 "static member constraints" 可用于编写通用数字代码。这仅限于 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#。
我正在编写一个程序集,其中包含一些旨在处理数字基元(即 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
我怎样才能使这个通用的数字基元?
F# 有所谓的 "static member constraints" 可用于编写通用数字代码。这仅限于 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#。