4
In Optim.jl haben wir einen Typalias OptimizationTrace{T}
, der ein Alias für Vector{OptimizationState{T}}
ist, wobei T
vom Typ Optimizer
ist. Ich möchte einen Konstruktor OptimizationTrace{T}(method::T) = OptimizationTrace{T}()
erstellen, aber ich kämpfe, um es zur Arbeit zu bringen.So definieren Sie einen Konstruktor für einen Typalias in Julia
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}(...),