How to define constructor for types in Julia

In Optim.jl, we have typealias OptimizationTrace{T}, which is an alias for Vector{OptimizationState{T}}where it Thas a type Optimizer. I want to create a constructor OptimizationTrace{T}(method::T) = OptimizationTrace{T}(), but I'm struggling to make it work.

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}(...),
+4
source share
1 answer

For what it's worth, the most direct way works in 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())

Edit: and (credit Kristoffer Karlsson) to v0.4

call{T <: Optimizer}(::Type{OptimizationTrace}, method::T) = Vector{OptimizationState{T}}()
+4
source

Source: https://habr.com/ru/post/1651393/


All Articles