我正在用 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/