【发布时间】:2016-07-25 03:22:45
【问题描述】:
以下给出重复定义错误:
let (.*) (m1 : Matrix<float>) (m2 : Matrix<float>) =
m1.Multiply(m2)
let (.*) (v1 : Vector<float>) (v2 : Vector<float>) =
v1.DotProduct(v2)
有没有办法定义运算符重载,以便 F# 根据函数签名识别我尝试调用的函数?
例如 Julia 有这个非常有用的功能:
julia> methods(*)
# 138 methods for generic function "*":
*(x::Bool, y::Bool) at bool.jl:38
*{T<:Unsigned}(x::Bool, y::T<:Unsigned) at bool.jl:53
*(x::Bool, z::Complex{Bool}) at complex.jl:122
*(x::Bool, z::Complex{T<:Real}) at complex.jl:129
...
如果有一种方法可以在 F# 中复制类似的东西,那就太好了。
【问题讨论】:
-
F# 可以进行广泛的类型推断,并且不能很好地处理函数/运算符重载。您需要内联或将其放入类中。
-
事实上你似乎不能在扩展成员中重载运算符...
-
顺便说一句,我看了一下 Julia,它很好,但显然这是它的优势之一:'Julia 程序是围绕多个调度组织的;通过定义函数并为不同的参数类型组合重载它们,这也可以是用户定义的。 '
标签: f# operator-overloading math.net