我正在玩Julia中CoVectors的想法,并且我得到了一些我从解析器/编译器中得不到的行为。我定义了一个新的CoVector
类型,它是任何向量的ctranspose
,只是一个简单的装饰:
type CoVector{T<:AbstractVector}
v::T
end
可以使用'
ctranspose
创建(和不创建)它们:
import Base.ctranspose
function CoVector(T::DataType,d::Integer=0)
return CoVector(Array(T,d))
end
function Base.ctranspose(cv::CoVector)
return cv.v
end
function Base.ctranspose(v::AbstractVector)
return CoVector(v)
end
function Base.ctranspose(v::Vector) # this is already specialized in Base
return CoVector(v)
end
接下来我想定义一个简单的点积
function *(x::CoVector,y::AbstractVector)
return dot(x.v,y)
end
哪种方法可以正常使用:
v = [1,2,3]
cv = v'
cv*v
返回14
,cv
是CoVector
。但是如果我做的话
(v') * v
我得到了不同的东西!在这种情况下,它是包含14
的单个元素数组。为什么括号怎么会按照我的预期工作呢?
最后,我们看到表达式扩展为Ac_mul_B
,默认为[dot(A,B)]
,似乎这种解释是在&#34;运算符&#34;水平。
这是预期的行为吗? Julia可以完全忽略我的包围并根据需要更改表达式吗?在Julia我喜欢我可以覆盖Base中的内容但是是否也可以对运算符的应用进行自我更改?我看到表达式没有头call
但是Symbol call
...这在Julia 0.4中有变化吗? (我在某处读到call
正变得越来越普遍)。
我想我可以通过重新定义Ac_mul_B
来解决问题,但鉴于我的上述定义,我很惊讶它完全被调用了。