Julia 类型不稳定&;工厂建造师

Julia 类型不稳定&;工厂建造师,julia,type-stability,Julia,Type Stability,比如说,我有一个类型层次结构 abstract A immutable B <: A end immutable C <: A end 它根据预期的输入返回不同的子类型。但是,它的类型也不稳定,因为我无法找到强制返回类型为a 那么,在这里有工厂模式不好吗?类型不稳定性是否只影响不可变类型而不是可变类型,因为后者无论如何都是引用类型 我必须为此选择参数化类型吗 immutable D{T <: A} type::T end function D(x::Int)

比如说,我有一个类型层次结构

abstract A
immutable B <: A end
immutable C <: A end
它根据预期的输入返回不同的子类型。但是,它的类型也不稳定,因为我无法找到强制返回类型为
a

那么,在这里有工厂模式不好吗?类型不稳定性是否只影响不可变类型而不是可变类型,因为后者无论如何都是引用类型

我必须为此选择参数化类型吗

immutable D{T <: A}
    type::T
end

function D(x::Int)
    if x > 0
        D(B())
    else
        D(C())
    end
end
不可变的D{t0
D(B())
其他的
D(C())
结束
结束
感觉有点糟糕

实际上,拥有类型不稳定的函数有多糟糕?为了更好的代码可读性是否值得交换


或者,我是否应该定义
typealias A Union{B,C}

function A(x::Int)
    if x > 0
        B()::A
    else
        C()::A
    end
end
但这并没有帮助:

julia> @code_warntype A(5)
Variables:
  x::Int64

Body:
  begin  # none, line 2:
      unless (Base.slt_int)(0,x::Int64)::Bool goto 0 # none, line 3:
      return $(Expr(:new, :((top(getfield))(Main,:B)::Type{B})))
      goto 1
      0:  # none, line 5:
      return $(Expr(:new, :((top(getfield))(Main,:C)::Type{C})))
      1: 
  end::Union{B,C}
您无法创建抽象类型的实例。此外,在当前的julia中,任何抽象类型都会自动“类型不稳定”,这意味着编译器无法为其生成优化的代码。因此,不存在“强制返回类型为A”然后以某种方式使函数类型稳定的情况(在取得优异成绩的意义上)

您可以实现类型稳定的工厂模式,但输出类型应由输入类型决定,而不是由输入值决定。例如:

A(x::Vector) = B()
A(x::Matrix) = C()
是一个类型稳定的构造函数,用于
a
层次结构的对象

如果没有明显的类型来表示您的意图,您可以始终使用
Val

A(x, ::Type{Val{1}}) = B()
A(x, ::Type{Val{2}}) = C()

A(1, Val{1})   # returns B()
A(1, Val{2})   # returns C()
A(x, ::Type{Val{1}}) = B()
A(x, ::Type{Val{2}}) = C()

A(1, Val{1})   # returns B()
A(1, Val{2})   # returns C()