f# - 如何使用重载的静态运算符

标签 f# operator-overloading static-methods type-inference

我正在用 F# 编写一个小型矩阵库(主要是包装器方法),并且在静态运算符方法的重载方面存在问题,F# 选择了我不打算这样做的重载。

我有一个模块,我在其中定义了矩阵与向量的右乘:

[<AutoOpen>]
module MatrixOps =

let (*) (matrix : IMatrix) (vector : IVector) =
    (...)

这让我可以写一些东西,例如A * v 其中 A 是 IMatrix,v 是 IVector。但是,我现在在上面的 let-binding 下添加以下行:
let z = 1.0 * 2.0

然后,F# 编译器将此识别为错误。将鼠标悬停在“1.0”上,我得到:“'float' 类型与'IMatrix' 类型不兼容,同样,将鼠标悬停在“2.0”上,我得到:“'float' 类型与'类型'不兼容IVector'”。这里发生的情况似乎是 F# 编译器未能将乘法运算符应用于浮点数,而是将运算符应用于 IMatrix 和 IVector。如果我改为写
let z = (1.0 : float) * (2.0 : float)

问题仍然存在,因此添加显式类型注释无济于事。如何确保 F# 选择 float 乘法运算符而不是我上面定义的 IMatrix/IVector 运算符?

最佳答案

F# 不允许您仅通过添加 let 绑定(bind)函数来定义重载。

F# 支持标准 .NET 实例或静态成员重载,因此在这种情况下,您需要添加一个静态成员:

type Matrix =
  static member (*) (matrix : Matrix) (vector : IVector) = ..

注意:我建议您不要在矩阵和向量之间进行这种设计。如果您继续以这种方式定义重载,我的意思是在混合类型之间,重载决议可能会变得模棱两可。

最好只在矩阵之间定义重载,然后在向量之间定义另一个集合。然后你可以定义一个像 asMatrix 这样的函数这允许您将向量包装在矩阵中,然后将矩阵相乘。

关于f# - 如何使用重载的静态运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40864859/

相关文章:

c++ - 重载流插入运算符错误,无法编译

java - 静态内部类和类的静态成员共享同名?

f# - 如何使用 FSharp.Control.Reactive 观察计算来实现 Observable.take?

matlab - 将 MATLAB 稀疏过滤移植到 F# 时,我应该使用什么求解器来替换 minFunc

c++ - 如何在自定义类中启用 'auto loops'?

c++ - 重载 = 运算符

python - Pytest 不收集静态方法

android - 使用 Android 数据绑定(bind)时如何访问 BindingAdapter 中的实例变量?

c# - 使用基于 F# 的测试工具对 C# 实现进行单元测试

.net - 在自定义计算表达式中实现绑定(bind)