Julia Union of Composite Types:`convert`没有匹配转换的方法

时间:2016-08-15 15:16:33

标签: types julia

我正在尝试在我创建的两种复合类型之间建立联盟:

type point
   x::Int8
   y::Int8
end

type vector
    x::Int8
    y::Int8
end

VecOrPoint = Union{point,vector}

x = point(Int8(2),Int8(3))
y = vector(Int8(2),Int8(3))

function sum(u::VecOrPoint,v::VecOrPoint)
  return  VecOrPoint(u.x + v.x,u.y + v.y) # ERROR HERE
end


z = sum(x,y)

我得到了以下错误:

ERROR: LoadError: MethodError: `convert` has no method matching    

convert(::Type{Union{point,vector}}, ::Int8, ::Int8)

This may have arisen from a call to the constructor Union{point,vector}  (...),

since type constructors fall back to convert methods.

Closest candidates are:
call{T}(::Type{T}, ::Any)
convert{T}(::Type{T}, !Matched::T)

in sum at /home/renatinho/periodoAtual/recsys/testeJulia.jl:17

while loading /home/renatinho/periodoAtual/recsys/testeJulia.jl, in 

expression starting on line 20

我已经在谷歌上发了但我找不到任何东西

1 个答案:

答案 0 :(得分:3)

来自朱莉娅documentation

  

类型联合是一种特殊的抽象类型

here

  

抽象类型无法实例化

因此,你想做的事情是不可能的。 (当你在函数中调用VecOrPoint()时,你正在尝试创建一个实例化,即尝试创建一个类型为你的类型联合的对象。)

我也不太明白你想要做的目的背后的目的。当联盟中的类型不同时,将某些东西“转换”为类型联合是什么意思? (在你给出的例子中,这两种类型是相同的,所以我认为在非常有限的意义上它可能是有可能的,但是如果有两个相同的类型,那么也就没有任何意义,然后将它们结合起来)

如果你想沿着这些方向完成某些事情,你或许可以给自己写一个新的Myconvert()函数(或者可能重载现有的convert函数)。在新函数中,您可以对输入执行某些逻辑,并根据该逻辑将其转换为您的一种或另一种类型。然后,您的新功能可以合理地将您的类型联合作为输入。

编辑:或者,正如克里斯在评论中建议的那样,使用类型调度。另请参阅Dan对原始帖子的评论,以获得另一个有用的想法。