Hello! I’m new to julia and trying to get a grasp on parametric types / use it like a geric type.
Here’s the code:
struct Interval{T}
start::Int
stop::Int
val::T
end
struct ScAIList{T}
interval_list::Vector{Interval{T}}
other_stuff::Int
end
function ScAIList{T}(inputs::Vector{Interval{T}})::ScAIList{T} where T
input_len = length(inputs)
return DataStructure(inputs, input_len)
end
function main()
inputs = [Interval(3, 5, true), Interval(4, 10, false)]
container = ScAIList{Bool}(inputs)
end
main()
Error message:
ERROR: MethodError: no method matching ScAIList{Bool}(::Array{Interval{Bool},1}, ::Int64)
Closest candidates are:
ScAIList{Bool}(::Any, ::Any, ::Any, ::Any, ::Any) where T at /home/me/.julia/dev/scailist/src/scailist.jl:15
ScAIList{Bool}(::Array{Interval{T},1}) where T at /home/me/.julia/dev/scailist/src/scailist.jl:23
ScAIList{Bool}(::Array{Interval{T},1}, ::UInt64) where T at /home/me/.julia/dev/scailist/src/scailist.jl:23
Stacktrace:
[1] ScAIList{Bool}(::Array{Interval{Bool},1}) at /home/me/.julia/dev/scailist/src/scailist.jl:23
[2] top-level scope at REPL[7]:1
My outer constructor doesn’t appear to apply ‘T’ to the Interval it contains?
Please provide self containing code. Here, DataStructure is not defined.
To stress Kris’ point, if you change that to ScAIList the code works. But probably that is not what you need 
julia> main()
ERROR: UndefVarError: DataStructure not defined
Stacktrace:
[1] ScAIList{Bool}(::Array{Interval{Bool},1}) at ./REPL[3]:3
[2] main() at ./REPL[4]:3
[3] top-level scope at none:0
julia> function ScAIList{T}(inputs::Vector{Interval{T}})::ScAIList{T} where T
input_len = length(inputs)
return ScAIList(inputs, input_len)
end
julia> main()
ScAIList{Bool}(Interval{Bool}[Interval{Bool}(3, 5, true), Interval{Bool}(4, 10, false)], 2)
Cheers!
Well, I feel foolish. In getting a working example together, I think I figured it out. I had a default argument to ScAIList that was the wrong type, so nothing was working. The parametric types were working as expected the whole time!
Working example code:
struct Interval{T}
start::Int
stop::Int
val::T
end
struct ScAIList{T}
intervals::Vector{Interval{T}}
num_comps::Int
comp_lens::Vector{Int}
comp_idxs::Vector{Int}
max_ends::Vector{Int}
end
function ScAIList{T}(input_intervals::Vector{Interval{T}}, min_cov_len::Int = 20)::ScAIList{T} where T
max_comps = floor(Int, log2(float(length(input_intervals)))) + 1
min_cov = div(min_cov_len, 2)
# A compoenet is essentially a sublist
num_comps = nothing # number of components
comp_lens = Vector{Int}() # lengths of each component
comp_idxs = Vector{Int}() # start positions of each component
max_ends = Vector{Int}() # list of the max end positions
min_comp_len = max(64, min_cov_len) # min length of a component
input_len = length(input_intervals)
sort!(input_intervals, by = iv -> iv.start)
decomposed = Vector{Interval{T}}()
# if input_len <= min_comp_len
num_comps = 1
push!(comp_lens, input_len)
push!(comp_idxs, 1)
append!(decomposed, input_intervals)
# end
# Augment with maxend
for j in 1:num_comps
comp_start = comp_idxs[j]
comp_end = comp_start + comp_lens[j] - 1
max_end = decomposed[comp_start].stop
push!(max_ends, max_end)
for iv in decomposed[comp_start:comp_end]
if iv.stop > max_end
max_end = iv.stop
end
push!(max_ends, max_end)
end
end
return ScAIList{T}(decomposed, num_comps,comp_lens, comp_idxs, max_ends)
end
in repl
ScAIList{Bool}([Interval(3, 5, true), Interval(4, 10, false)])
https://repl.it/repls/HilariousDentalBlocks