我正在尝试编写适用于 float、double 等类型并使用算术运算的通用 Vector2 类型。是否有机会使用 C#、F#、Nemerle 或任何其他或多或少成熟的 .NET 语言来实现?
我需要一个解决方案
- (1) 良好的表现(就像我单独写一样 Vector2Float、Vector2Double 等类),
- (2) 这将允许 代码看起来不错(我不想为每个类发出代码 运行时)
- (3) 并且会尽可能多地进行编译时检查。
出于第 1 和第 3 个原因,我不想使用动力学。现在我正在检查 F# 和 Nemerle。
UPD:我希望有很多这种类型的数学代码。但是,如果可能的话,我更愿意将代码放在扩展方法中。
UPD2:“等”类型包括 int(我实际上怀疑我会使用)和 decimal(我想我可能会使用,但不是现在)。使用扩展方法只是个人喜好问题 - 如果有充分的理由不这样做,请告知。
最佳答案
正如 Daniel 所提到的,F# 具有称为静态解析类型参数 的功能,它超出了您在 C# 中使用普通 .NET 泛型所能做的事情。诀窍在于,如果您将函数标记为 inline
,F# 会自动生成专用代码(有点像 C++ 模板),然后您可以使用 F# 类型系统的更强大功能来编写通用数学。
例如,如果您编写一个简单的添加函数并使其内联
:
let inline add x y = x + y;;
类型推断打印出以下类型:
val inline add :
x: ^a -> y: ^b -> ^c
when ( ^a or ^b) : (static member ( + ) : ^a * ^b -> ^c)
您可以看到推断类型相当复杂 - 它指定了一个成员约束,该约束需要两个参数之一来定义一个 +
成员(标准 .NET 类型也支持这一点)好处是这可以完全推断出来,因此您很少需要编写丑陋的类型定义。
如评论中所述,我写了一篇文章Writing generic numeric code其中详细介绍了如何在 F# 中执行此操作。我不认为这可以在 C# 中轻松完成,并且您在 F# 中编写的内联函数只能从 F# 调用(从 C# 调用它们本质上将使用动态)。但是您绝对可以在 F# 中编写您的通用数值计算。
关于c# - 如何避免在 .NET 中为不同的数字类型编写重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22014644/