Mau*_*cio 3 types function julia
Type
在 Julia 中,我可以定义一个接受所有子类型的函数
function foo{T<:Type}(bar::T, arg::T) end
Run Code Online (Sandbox Code Playgroud)
但这强制要求bar
和arg
是 的相同子类型Type
。Type
是否有一个简写来定义接受不同子类型的forbar
和函数arg
?我知道我能做到
function foo{T<:Type, S<:Type}(bar::T, arg::S) end
Run Code Online (Sandbox Code Playgroud)
但对于一个有多个参数的函数来说,就显得相当麻烦了。
当 左侧使用的类型T<:Type
是抽象类型时,声明为类型的函数参数T
将接受属于该抽象的所有内容,包括属于从属(继承)抽象的内容。
对于大多数目的,这些东西是具体类型的实现,即类型的实例化。具体类型可能有一个抽象类型作为其超类型,而该抽象类型可能有另一个更抽象的类型作为其超类型,依此类推。 Any
是最超的超类型,抽象类型树的根。
在示例中
function foo{T<:Type}(bar::T, arg::T) ... end
Run Code Online (Sandbox Code Playgroud)
每次调用 时foo
,T
都采用 或 的子类型之一,Type
但仍保留Type
其自身。这就是为什么bar
和arg
必须共享相同的特定类型foo
才能匹配和调用此版本。它解释了为什么下一个示例匹配并被称为
function foo{T<:Type, U<:Type}(bar::T, arg::U) ... end
Run Code Online (Sandbox Code Playgroud)
当foo
和bar
是 but 的每个子类型时Type
,都是两个不同具体类型的实现(例如Int32
和Int64
共享抽象超类型Integer
)。
对于使用您打算接受不同类型事物的参数,没有通用的速记法;不同的类别共享一个共同的抽象类型是有用的信息,它允许您定义第一种和第二种调用方式foo
。这种管理算法规范的灵活方式通常可以简化实现。这就是 Julia 的多调度所提供的一些优势。
在某些情况下,使用typealias
可以简化函数签名的编写。 typealias
可以很好地使用共享超类型的非重叠子类型集合来选择性地分派。
typealias FastInt Union{ Int32, Int64 } # division is fast
typealias SlowInt Union{ Int8, Int128 } # slightly slower
foo{T<:Integer}(a::T, b::T) ... end; # default/fallback
foo{T<:FastInt}(a::T, b::T) ... end; # specialized for fast types
foo{T<:SlowInt}(a::T, b::T) ... end; # specialized for slow types
Run Code Online (Sandbox Code Playgroud)
````