줄리아의 타입과 애노테이션
コード
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言語のように、String
はChar
の配列であり、上のようにダブルクォートかシングルクォートで区別される。
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