朱莉娅:为什么参数类型必须有外部构造函数?

时间:2014-09-04 16:28:13

标签: julia

以下作品:

type TypeA
       x :: Array
       y :: Int
       TypeA(x :: Array ) = new(x, 2)
       end

julia> y = TypeA([1,2,3])
TypeA([1,2,3],2)

这不是:

type TypeB{S}
       x :: Array{S}
       y :: Int
       TypeB{S}( x:: Array{S} ) = new(x,2)
       end

julia> y = TypeB([1,2,3])
ERROR: `TypeB{S}` has no method matching TypeB{S}(::Array{Int64,1})

为了使第二种情况起作用,必须在类型声明之外声明构造函数。这略微不合需要。 我的问题是为什么从Julia设计的角度来看这个问题存在,所以我可以更好地推理Julia类型系统。

谢谢。

1 个答案:

答案 0 :(得分:8)

这有效:

type TypeB{S}
    x::Array{S}
    y::Int
    TypeB(x::Array{S}) = new(x,2)
end
TypeB{Int}([1,2,3])

我在reading the manual找到了,但我必须承认我并不是很了解内部构造函数,特别是对于参数类型。我认为它是因为你实际上是在定义一个类型的族,所以内部构造函数只对每个类型都有意义 - 因此你需要指定{Int}来说明你想要的类型。您可以添加外部构造函数以使其更容易,即

type TypeB{S}
    x::Array{S}
    y::Int
    TypeB(x::Array{S}) = new(x,2)
end
TypeB{S}(x::Array{S}) = TypeB{S}(x)
TypeB([1,2,3])

我认为在Julia问题页面上提出它是件好事,因为我觉得默认情况下可以提供这个外部帮助器构造函数。

编辑:这个Julia issue指出了默认情况下提供外部构造函数的问题。