Юля: что означает символ «<:»?

Что это означает в сигнатурах функций, например:

convert(::Type{T}, z::Complex) where {T<:Real}

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
165
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

<:( Т1, Т2)

Оператор подтипа: возвращает true тогда и только тогда, когда все значения типа T1 равны также типа T2.

Примеры:

Float64 <: AbstractFloat
=> true

Vector{Int} <: AbstractArray
=> true

Matrix{Float64} <: Matrix{AbstractFloat}
=> false
Ответ принят как подходящий

Строго говоря, следует различать предикат Base.:(<:), как описано в ответе @Saqib, и синтаксическое использование <: для описания ограничений.

Это синтаксическое использование может иметь место в объявлениях параметров типа методов, чтобы ограничить переменную типа подтипом другого типа:

f(x::T) where {T<:Real} = zero(x)

Своеобразный особый случай этого - когда вы ограничиваете параметр типа структуры (struct Foo{T<:Real} ... end), который ограничивает методы сгенерированного конструктора и позволяет применять конструктор типа только к ограниченным подтипам.

С другой стороны, помимо параметров типа, <: можно использовать для объявления нового типа как подтипа другого (обязательно абстрактного) типа:

struct Foo <: Real end

Хотя оба случая соответствуют значению предиката подтипа, вы не можете заменить их другими произвольными выражениями (например, вы не можете записать ... where {isreal(T)} в f).

На самом деле, если я набираю struct Foo{T<:Real} end; Foo{String} в REPL, я получаю TypeError: in Foo, in T, expected T<:Real, got Type{String}, что указывает мне, что это не просто ограничение для конструкторов (в Julia версии 1.5). Может быть, Foo{String} работал раньше, но теперь они исправили это поведение?

Cameron Bieganek 19.11.2020 18:22

См. Мой комментарий по другому вопросу, я ошибся и испортил свой тестовый пример.

phipsgabler 19.11.2020 18:24

Хотя это все-таки как-то особый случай. Я думаю, мы могли бы думать о семантике как об определении метода Core.apply_type(::Type{Foo}, ::Type{T}) where {T<:Real}) (если бы он не был встроенным).

phipsgabler 19.11.2020 18:28

Другие вопросы по теме