logo

줄리아의 타입과 애노테이션 📂ジュリア

줄리아의 타입과 애노테이션

コード

julia> typeof(0)
Int64

julia> typeof(0.0)
Float64

julia> typeof(0 == 0.0)
Bool

julia> typeof(Bool)
DataType

julia> typeof(NaN)
Float64

julia> typeof(Inf)
Float64

julia> typeof('O')
Char

julia> typeof("Ohmygirl")
String

julia> typeof("O")
String

Juliaには様々なタイプが実装されている。$0$と$0.0$は同じ$0$だが、異なるタイプを持っており、見ての通り、BoolでさえDataTypeというタイプを持っている。C言語のように、StringCharの配列であり、上のようにダブルクォートかシングルクォートで区別される。

julia> supertype(Int64)
Signed

julia> supertype(Signed)
Integer

julia> supertype(Integer)
Real

julia> supertype(Real)
Number

julia> supertype(Number)
Any

julia> supertype(Any)
Any

上のようにsupertype()関数を使えば、タイプの上位タイプを確認できる。すべてのタイプはAnyタイプのサブタイプである。Anyは文字通りすべてを包含するため、便利で生産性が高い。

julia> x = ["o", -1, [7,'m'],3.0]
4-element Array{Any,1}:
   "o"
 -1
   Any[7, 'm']
  3.0

julia> typeof(x)
Array{Any,1}

julia> x[2] = 1.2
1.2

julia> typeof(x)
Array{Any,1}

julia> y = [0,1,1]
3-element Array{Int64,1}:
 0
 1
 1

julia> typeof(y)
Array{Int64,1}

julia> y[2] = 1.2
ERROR: InexactError: Int64(1.2)
Stacktrace:
 [1] Int64 at .\float.jl:710 [inlined]
 [2] convert at .\number.jl:7 [inlined]
 [3] setindex!(::Array{Int64,1}, ::Float64, ::Int64) at .\array.jl:847
 [4] top-level scope at REPL[39]:1

julia> typeof(y)
Array{Int64,1}

Anyで作られた配列は値の代入や操作がシンプルに行われるが、整数の配列に限定される場合は不可能である。Juliaは強いタイプの言語で、このように推論されるタイプを与えることで、パフォーマンスを向上させ、バグの発生を根本的に防ぐことができる。タイプを制限することをアノテーションといい、まずプログラムが実装されているか確認した後、必ず最適化することが望ましい。通常、Juliaを使う最大の理由は速さである。

julia> function add1(a,b)
           return a+b
       end
add1 (generic function with 1 method)

julia> add1(1,2)
3

julia> add(1,2.0)
ERROR: UndefVarError: add not defined
Stacktrace:
 [1] top-level scope at REPL[43]:1

julia> function add2(a::Int64, b::Float64)
           return a+b
       end
add2 (generic function with 1 method)

julia> add2(1,2)
ERROR: MethodError: no method matching add2(::Int64, ::Int64)
Closest candidates are:
  add2(::Int64, ::Float64) at REPL[44]:1
Stacktrace:
 [1] top-level scope at REPL[45]:1

julia> add2(1,2.0)
3.0

上のように::を使って変数が具体的に何であるかを指定すると、タイプが合わない場合にエラーを出す。このようにアノテーションがされていると、タイプをチェックする必要がなくなり、当然パフォーマンスが向上する。

環境

  • OS: Windows
  • julia: v1.5.0