Jakie jest znaczenie <: in julia? [duplikować]

Nov 20 2020

Czy ktoś może mi pomóc z tym kodem:

struct GenericPoint{T<:Real}
x::T
y::T
end

Jakie jest znaczenie <:w {T<:Real}w języku Julialang?

Odpowiedzi

8 FrançoisFévotte Nov 19 2020 at 23:42

Zacznę od stwierdzenia, że strona instrukcji z interpunkcją jest wygodnym sposobem wyszukiwania takich operatorów, których w innym przypadku bardzo trudno byłoby znaleźć za pomocą wyszukiwarki. W konkretnym przypadku <:znajdujemy tę stronę z odpowiednią dokumentacją dla podstawowych operatorów .

Istnieją (co najmniej) 3 konteksty, w których A <: Bmożna by użyć, iw każdym z nich wyraża to ideę, która Ajest podtypem B.

  1. jako predykat, A <: Bzwraca truewtedy i tylko wtedy, gdy wszystkie wartości typu Asą również typu B:
julia> Int <: Number
true

julia> Int <: AbstractString
false
  1. w definicji typu deklaruje, że nowo zdefiniowany typ jest podtypem istniejącego (abstrakcyjnego) typu:
# `Foo` is declared to be a subtype of `Number`
struct Foo <: Number
end
  1. jako ograniczenie typu-parametr (jak w Twoim przykładzie), T <: Realwyraża ideę, że parametr typu Tmoże być dowolnym podtypem Real:
julia> struct GenericPoint{T<:Real}
           x::T
           y::T
       end

# Works because 1 and 2 are of type Int, and Int <: Real
julia> GenericPoint(1, 2)
GenericPoint{Int64}(1, 2)

# Does not work because "a" and "b" are of type String,
# which is not a subtype of Real
julia> GenericPoint("a", "b")
ERROR: MethodError: no method matching GenericPoint(::String, ::String)
Stacktrace:
 [1] top-level scope at REPL[5]:1

Należy zauważyć, że użycie ograniczeń typu parametr nie jest ograniczone do definicji typów parametrycznych, ale ma również zastosowanie do definicji funkcji / metod:

julia> foo(x::Vector{T}) where {T<:Number} = "OK"
foo (generic function with 1 method)

# OK because:
# - [1,2,3] is of type Vector{Int}, and
# - Int <: Number
julia> foo([1, 2, 3])
"OK"

# Incorrect because:
# - ["a", "b", "c"] is of type Vector{String}, but
# - String is not a subtype of Number
julia> foo(["a", "b", "c"])
ERROR: MethodError: no method matching foo(::Array{String,1})