2017-06-11 10 views
2

n次元形状を表す単純型を定義したいと考えています。タイプパラメータはnです。ジュリアの強制積分型パラメータ

julia> struct Shape{n} 
      name::String 
     end 

julia> square = Shape{2}("square") 
Shape{2}("square") 

julia> cube = Shape{3}("cube") 
Shape{3}("cube") 

julia> dim(::Shape{n}) where n = n 
dim (generic function with 1 method) 

julia> dim(cube) 
3 

このソリューションが作業を行いますが、それは問題なくnの非整数値を受け入れます。

julia> Shape{'?'}("invalid") 
Shape{'?'}("invalid") 

私の最初に考えたのはstruct宣言でnに制約を使用することでした。しかし、私はこれを達成すべきだと思った方法もどちらもうまくいかなかったようです。

julia> struct Shape{n} where n <: Int 
      name::String 
     end 
ERROR: syntax: invalid type signature 

julia> struct Shape{n<:Int} 
      name::String 
     end 

julia> Shape{2}("circle") 
ERROR: TypeError: Shape: in n, expected n<:Int64, got Int64 

また、内部コンストラクタを使用してみましたが、これはどちらかと思われませんでした。

julia> struct Shape{n} 
      Shape{n}(name) where n <: Int = new(name) 
      name::String 
     end 

julia> Shape{2}("circle") 
ERROR: MethodError: Cannot `convert` an object of type String to an object of type Shape{2} 
This may have arisen from a call to the constructor Shape{2}(...), 
since type constructors fall back to convert methods. 
Stacktrace: 
[1] Shape{2}(::String) at ./sysimg.jl:24 

私はJulia 0.6.0-rc3.0を使用しています。

希望の動作を達成するにはどうすればよいですか?

+0

このために内部コンストラクタが機能します。どのようなコードを使用しましたか? –

+0

@ChrisRackauckas謝罪;私はそのコードをコピーするのを忘れてしまったようです。投稿が更新されました。 –

+0

'N'の型はIntですが、'

答えて

5

nのタイプはIntであるが、それは<:IntあるDataTypeありません。あなたはどこにnを入れてからコンストラクタの中に@assert typeof(n) <: Intを入れる必要があります。

struct Shape{n} 
    name::String 
    function Shape{n}(name) where n 
    @assert typeof(n) <: Int 
    new(name) 
    end 
end 
Shape{2}("square") 
Shape{:hi}("square") 
+4

それだけで汗をかいてはいけません。タイプ 'Shape {String} 'は技術的に存在しますが、まったく役に立たないです。同様に、 'Array {12.5、()}'は存在しますが、あまりそれを行うことはできません。 – StefanKarpinski

+0

それを汗ばませないでください。タイプ 'Shape {String} 'は技術的に存在しますが、まったく役に立たないです。同様に、 'Array {12.5、()}'は存在しますが、あまりそれを行うことはできません。 – StefanKarpinski

関連する問題