Julia: Instantiated type parameters

2019-05-22 17:43发布

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?

1条回答
倾城 Initia
2楼-- · 2019-05-22 18:31

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.

查看更多
登录 后发表回答