c# - 如何避免在 .NET 中为不同的数字类型编写重复代码

标签 c# f# numbers dry nemerle

我正在尝试编写适用于 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/

相关文章:

c# - 数据访问层和MVC分离?

c# - 带有 App.config 文件的 SQL Server 外部的 connectionString

f# - 使用F#时,当前是否不可能将UWP应用发布到Store?

variables - 为什么整数变量大小受到限制(限制为 32/64 位等)?

Java 正则表达式 : Extracting a Version Number

c# - 如何使用 Moq.MockRepository.Of() 方法

f# - F# 核心方法的后缀数字是什么?

debugging - 将 OCaml 转换为 F# : Is there an OCaml IDE with GUI debugging like Visual Studio

Haskell -- 如何将数字拆分为列表以进行进一步处理?

c# - Entity Framework 函数是否自动转义输入以防止注入(inject)?