以下作品:
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类型系统。
谢谢。
答案 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指出了默认情况下提供外部构造函数的问题。