以下作品:
type TypeA
x :: Array
y :: Int
TypeA(x :: Array ) = new(x, 2)
end
julia> y = TypeA([1,2,3])
TypeA([1,2,3],2)
Run Code Online (Sandbox Code Playgroud)
这不是:
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})
Run Code Online (Sandbox Code Playgroud)
为了使第二种情况起作用,必须在类型声明之外声明构造函数.这有点不合需要.我的问题是为什么这个问题存在于Julia设计的角度,所以我可以更好地推理Julia类型系统.
谢谢.
这有效:
type TypeB{S}
x::Array{S}
y::Int
TypeB(x::Array{S}) = new(x,2)
end
TypeB{Int}([1,2,3])
Run Code Online (Sandbox Code Playgroud)
我通过阅读手册找到了,但我必须承认我并不真正理解内部构造函数,特别是对于参数类型.我认为它是因为你实际上是在定义一个类型的族,所以内部构造函数只对每个类型都有意义 - 因此你需要指定{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])
Run Code Online (Sandbox Code Playgroud)
我认为将它放在Julia问题页面上会很好,因为我觉得默认情况下可以提供这个外部帮助器构造函数.
编辑:这个Julia问题指出了默认情况下提供外部构造函数的问题.