Что такое абстрактные типы?
Абстрактные типы - это узлы в иерархии типов: они группируют типы вместе. Это позволяет вам писать методы, которые применяются ко всей группе типов:
julia> abstract type AbstractFoo end
julia> struct Foo1 <: AbstractFoo end
julia> struct Foo2 <: AbstractFoo end
julia> foo_op(x::AbstractFoo) = "yay!"
foo_op (generic function with 1 method)
julia> foo_op(Foo1())
"yay!"
julia> foo_op(Foo2())
"yay!"
Почему полезны абстрактные типы?
Абстрактные типы позволяют отделить поведение от реализации. Это критично для производительности. Когда вы объявляете абстрактный супертип, вы автоматически наследуете базовое поведение супертипа, но можете свободно реализовывать более эффективные реализации этого поведения .
Типичным примером является AbstractArray
abstract тип. Он представляет возможность доступа к отдельным элементам некоторой многомерной коллекции элементов. Учитывая некоторую проблему, мы обычно можем выбрать подтип абстрактных массивов, которые будут давать эффективные операции: дополнительные ограничения на подтип составляют информацию, которую программист может использовать для повышения эффективности определенных операций .
Например, скажем, мы хотим найти сумму 1..N. Мы могли бы использовать массив целых чисел, но это было бы очень неэффективно по сравнению с UnitRange
. Выбор UnitRange
кодирует информацию о характеристиках данных; информация, которую мы можем использовать для эффективности. (См. этот ответ для получения дополнительной информации об этом примере.)
julia> using BenchmarkTools
julia> @btime sum($(1:1000_000))
0.012 ns (0 allocations: 0 bytes)
500000500000
julia> @btime sum($(collect(1:1000_000)))
229.979 μs (0 allocations: 0 bytes)
500000500000
BitArray
обеспечивает эффективное для пространства представление для массива логических значений, SparseArrays
обеспечивает эффективные операции для разреженных данных, и так далее. Если у вас есть данные, которые обычно ведут себя как абстрактный массив, но имеют уникальные характеристики, вы можете определить свой собственный подтип.
Этот шаблон обобщает другие абстрактные типы. Используйте их для группировки различных реализаций некоторого общего поведения.