如何在Julia中定义typealias的构造函数
在Optim.jl中,我们有一个类型别名如何在Julia中定义typealias的构造函数,julia,Julia,在Optim.jl中,我们有一个类型别名OptimizationTrace{T},它是Vector{OptimizationState{T}的别名,其中T属于优化器类型。我想创建一个构造函数OptimizationTrace{T}(method::T)=OptimizationTrace{T}(),但我正在努力让它工作 abstract Optimizer immutable NelderMead <: Optimizer end immutable OptimizationState
OptimizationTrace{T}
,它是Vector{OptimizationState{T}
的别名,其中T
属于优化器
类型。我想创建一个构造函数OptimizationTrace{T}(method::T)=OptimizationTrace{T}()
,但我正在努力让它工作
abstract Optimizer
immutable NelderMead <: Optimizer
end
immutable OptimizationState{T <: Optimizer}
iteration::Int
value::Float64
g_norm::Float64
metadata::Dict
end
typealias OptimizationTrace{T} Vector{OptimizationState{T}}
OptimizationTrace{NelderMead}() # works
# A different approach, define a convert-method.
OptimizationTrace{T}(method::T) = OptimizationTrace{T}() # Doesn't work:
ERROR: cannot define function OptimizationTrace; it already has a value
import Base.convert
convert{T<:Optimizer}(::Type{Array{OptimizationState{T},1}}, method::T) = OptimizationTrace{T}()
OptimizationTrace(NelderMead())
ERROR: MethodError: `convert` has no method matching convert(::Type{Array{OptimizationState{T},1}}, ::NelderMead)
This may have arisen from a call to the constructor Array{OptimizationState{T},1}(...),
抽象优化器
不变的NelderMead最直接的方法是在v0.5中
abstract Optimizer
immutable NelderMead <: Optimizer
end
immutable OptimizationState{T <: Optimizer}
iteration::Int
value::Float64
g_norm::Float64
metadata::Dict
end
typealias OptimizationTrace{T} Vector{OptimizationState{T}}
OptimizationTrace{T<:Optimizer}(method::T) = Vector{OptimizationState{T}}()
OptimizationTrace(NelderMead())
抽象优化器
不变内尔德米德
call{T <: Optimizer}(::Type{OptimizationTrace}, method::T) = Vector{OptimizationState{T}}()