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)
````
| 归档时间: |
|
| 查看次数: |
1851 次 |
| 最近记录: |