generics - F# 有通用算术支持吗?

标签 generics math f# inline

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 的数字操作。 (它本质上使用一些以类型为键的查找表)。然后,您可以使用数字运算对象的方法来执行乘法、加法( MultiplyAdd )等操作。该函数适用于任何数字:

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/

相关文章:

f# - 当某物不属于特定类型时如何进行模式匹配

c# - 如何在 C# 中调用带有泛型参数的泛型方法?

python - 如何在 Python 中创建自己的 "parameterized"类型(如 `Optional[T]` )?

java - 使用百分比时,找到一个随机整数创建另一个整数

c - 数组的指针算术

C#:控制台正在输出无穷大(∞)

scala - 如何在泛型类中引用伴生对象的方法?

c# - 通用类文件名约定

f# - 为什么 Frame.tryValues 在这个简单的例子中会失败?

c# - 是否可以在单个 Visual Studio Windows 控制台项目中混合使用 .cs (C#) 和 .fs (F#) 文件? (。网)