How does one define a type that, like Array, has a concrete/instantiated type parameter? My initial instinct was that it would be like this:
immutable Foo{N::Integer}
data::Array{Float64, N}
end
However, this generates the following error:
ERROR: syntax: malformed type parameter list
The following code is acceptable:
immutable Foo{N}
data::Array{Float64, N}
end
Foo{1}([1,2,3])
Foo{1}([1.0,2.0,3.0])
but I've been unable to find any instructions on restricting the type of the parameter N. I realize that in this case it may not be strictly necessary, but surely it would provide more intuitive error messages and should be possible?
Edit:
I've found a partial solution like so:
immutable Bar{N}
data::Array{Int64, N}
Bar(dat) = (
typeof(N) <: Integer && N > 0 ?
new(dat) :
error("Bar parameter N must be a positive integer"))
end
Bar{1}([1,2,3])
Bar{1}([1,2,3])
Bar{0}([])
ERROR: Bar parameter N must be a positive integer
While this solves the problem at hand, I would still be interested in knowing if there's a way to specify the type parameter's instantiated type up front as I tried to do in the initial code fragment in this post?
It is currently not possible to restrict type parameters like this, though there has been discussion to allow the syntax that you tried up at the top. I believe that the solution that you came up with of checking the type parameter in an inner constructor is considered the best practice right now.