F# 是否存在与 C# 相同的问题,无法直接对泛型 T 类型使用算术运算符?
你能编写一个通用的 Sum 函数来返回支持算术加法的任何值的总和吗?
最佳答案
正如 brian 提到的,有一些对泛型算术的内置支持,您可以使用“静态约束”,它允许您自己定义一些泛型函数(尽管这有点有限)。
除此之外,您还可以使用动态“数字关联”,这在函数中使用时速度有点慢,但它可以很好地用于定义您自己的向量或矩阵类型。这是一个例子:
#r "FSharp.PowerPack.dll"
open Microsoft.FSharp.Math
let twoTimesLarger (n:'a) (m:'a) =
let ops = GlobalAssociations.GetNumericAssociation<'a>()
let sel = if ops.Compare(n, m) > 0 then n else m
ops.Multiply(sel, ops.Add(ops.One, ops.One))
我们首先需要引用包含该功能的 F# PowerPack 库。然后我们定义一个带有签名 'a -> 'a -> 'a
的通用函数。第一行动态获取用于处理类型 'a
的数字操作。 (它本质上使用一些以类型为键的查找表)。然后,您可以使用数字运算对象的方法来执行乘法、加法( Multiply
、 Add
)等操作。该函数适用于任何数字:
twoTimesLarger 3 4
twoTimesLarger 2.3 2.4
twoTimesLarger "a" "b" // Throws an exception!
当您定义自己的数字类型时,您可以定义其数字操作并使用 GlobalAssociations.RegisterNumericAssociation
注册它们。我相信这也意味着您将能够使用内置 F# Matrix<YourType>
和Vector<YourType>
注册操作后。
关于generics - F# 有通用算术支持吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2225949/