Topazdocs
Политика языка

Типы

Каноническая грамматика, семантика, ограничения и отложенные границы: Типы.

Система типов объединяет точные примитивы, literal и union-типы, структурные записи, типы функций, стандартные generic-конструкторы и закрытые номинальные объявления без неявных преобразований.

Политика

Примитивы: int, float, string, bool и unit (). Стандартные конструкторы: Array<T>, Map<K,V>, Set<T>, Option<T>, Result<T,E>. type, включая generic alias, прозрачен и не создаёт nominal identity. Тип функции записывается (T) -> U, последний variadic-элемент — ...T. Nullable-значение является обычным union с null.

Определённое поведение

Literal-тип ограничивает значение одним литералом, union принимает любой член. Параметры типов invariant. Enum, record и newtype создают отдельные nominal identity; их construction, pattern, comparison, JSON shape, defaults, derives, protocols и receiver methods подчиняются ограниченным собственным правилам. Контекст задаёт тип для полиморфных пустых значений None, [] и generic-конструкторов.

Ограничения и явный отказ

Проверяющий отклоняет [T], function(T) -> U, не последний variadic, рекурсивные alias-циклы, несовместимые операции union и неразрешённые generic-empty. Bounds разрешены только параметрам типов именованной функции и допущенным статическим протоколам. Нет обещания structural subtyping, неявного int/float, variance, higher-rank типов и generic-лямбд.

Отложенная граница

Higher-rank polymorphism, variance, recursive aliases, bounds на alias и nominal declarations, открытые схемы, широкая рефлексия и расширенные protocol constraints отложены. Явные аргументы типов разрешены только точным допущенным rank-1 callable heads; частичные и декоративные списки отклоняются.

Пример

TOPAZ
type TrafficLight = "red" | "yellow" | "green"
type Pair<T> = { first: T, second: T }

function next(light: TrafficLight) -> TrafficLight {
    match light {
        case "red" => "green"
        case "green" => "yellow"
        case "yellow" => "red"
    }
}

let bounds: Pair<int> = { first: 0, second: 100 }

Связанные правила