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

Mag*_*eek 8 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)
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类型系统.

谢谢.

Iai*_*ing 8

这有效:

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问题指出了默认情况下提供外部构造函数的问题.