公称型システムとサブタイピング

公称型システムとサブタイピング#

Julia の型は, 抽象型と具象型に大別できる.

公称型システム#

Julia は公称型付けシステムを採用している.

julia> typeof(1.0)
Float64

julia> typeof("concrete-type")
String

julia> typeof(1) === Int
true

上記は, 具象型の確認例である. ここで, 最後に行に注目すると, 1 には Int という名前(型)がついており, その名前からオブジェクトが唯一に定まっていることが分かる. これが公称型付けである.

基本型と派生型#

Julia には, 数値型を意味する Number という型が存在する. ここで, NumberIntFloat64 の基本型, IntFloat64Number の派生型という. また, 2つ以上の型間に「基本型-派生型」の関係が形成されることをサブタイピングという. これらの関係は, 派生型演算子 <:, 基本型演算子 >: で確認できる.

julia> Int <: Number
true

julia> Number >: Int
true

派生型演算子では, (派生型) <: (基本型) の場合に, 基本型演算子では, (基本型) >: (派生型) の場合に, true が返ってくる. また, isa() でも同様の確認ができる.

ulia> isa(1, Int)
true

julia> isa(1, Number)
true

上記の例では, 1Int であり Number でもあることを示している. また, isa() は演算子 isa としても使用できる.

julia> 1 isa Int
true

型階層#

Number  (Abstract Type)
├─ Complex
└─ Real  (Abstract Type)
   ├─ AbstractFloat  (Abstract Type)
   │  ├─ Float16
   │  ├─ Float32
   │  ├─ Float64
   │  └─ BigFloat
   ├─ Integer  (Abstract Type)
   │  ├─ Bool
   │  ├─ Signed  (Abstract Type)
   │  │  ├─ Int8
   │  │  ├─ Int16
   │  │  ├─ Int32
   │  │  ├─ Int64
   │  │  ├─ Int128
   │  │  └─ BigInt
   │  └─ Unsigned  (Abstract Type)
   │     ├─ UInt8
   │     ├─ UInt16
   │     ├─ UInt32
   │     ├─ UInt64
   │     └─ UInt128
   ├─ Rational
   └─ AbstractIrrational  (Abstract Type)
      └─ Irrational

抽象型と具象型#

抽象型:オブジェクト(インスタンス)を生成できない型
具象型:オブジェクト(インスタンス)を生成できる型

抽象型であるかは isabstracttype() で, 具象型であるかは isconcretetype() で確認できる.

julia> isabstracttype(Int)
false

julia> isconcretetype(Int)
true

julia> isabstracttype(Number)
true

julia> isconcretetype(Number)
false

上記の例より, Int は具象型であるが, その基本型である Number は抽象型であることが分かる.

Any 型#

引数に渡した型の共通の基本型を返す関数として typejoin() が存在する.

julia> typejoin(Int, Float64)
Real

julia> typejoin(Int, String)
Any

上記の例より, IntFloat64 の共通の基本型(木構造的には親)は Real であることが分かる. また, IntString の共通の基本型として Any が返ってきている. これは, Juliaでは互換性のない型同士であっても共通の基本型 Any が存在するということである.

julia> isabstracttype(Any)
true

julia> length(subtypes(Any))
588

julia> supertype(Any)
Any

上記の例より, Any は抽象型であることが分かる. また, Any の直接の派生型は588個あり, Any の基本型は Any 自身であることが分かる. つまり, Any は全ての型の基本型なのである.

参考文献#

  • 後藤俊介, "実践Julia入門", 技術評論社, 2023. ISBN: 978-4-297-13350-4.