Union
Union 型は特殊な抽象型で、複数の型の和集合を表す。 次のように使う。
julia> IntOrString = Union{Int,String}
Union{Int64, String}
IntOrString が Union 型だ。
ここで、IntOrString 型の値を引数にとり、そのまま返す関数を定義する。
julia> union_type(x::IntOrString) = x
union_type (generic function with 1 method)
この関数の引数は IntOrString なので、Int でも String でも受け付けることができる。
julia> union_type(1)
1
julia> union_type("Julia")
"Julia"
別の型ではエラー。
julia> union_type(1.2)
ERROR: MethodError: no method matching union_type(::Float64)
The function `union_type` exists, but no method is defined for this combination of argument types.
Closest candidates are:
union_type(::Union{Int64, String})
@ Main REPL[2]:1
ところで、IntOrString は抽象型なので union_type の返り値にはならない。返り値は具体型である Int または String だ。
julia> typeof(union_type(1))
Int64
julia> typeof(union_type("Julia"))
String
Union型がよく使われるケースは、Nothing と組み合わせた、Union{String, Nothing} とかだ。
例えばリストの中から条件に合う文字列を探す関数があったとして、期待する返り値の型は String だけど、条件に合う文字列が見つからないときは nothing を返す。この関数の返り値を Union{String, Nothing} にする、など。
Haskell でいえば Maybe String だな。
