Основы языка

Типы

Выберите типы параметров и результата функции, задайте допустимые значения и типы пустых коллекций.

Выберите типы значений, которые функция принимает и возвращает, и укажите их в объявлении. На примере разберите вывод типа, объединение и тип функции.

Установите Топаз по инструкции Первая программа. Если функции и локальные значения вам незнакомы, начните с урока Значения и функции.

Проверьте и запустите функцию

Сохраните этот код в файле types.tpz в рабочей папке.

TOPAZ
type Стадия = "draft" | "ready"

function описать(стадия: Стадия, проверки: int) -> string {
    "{стадия} after {проверки} checks"
}

let проверки = 3
let текущая: Стадия = "ready"
let показать: (Стадия, int) -> string = описать

print(показать(текущая, проверки))

В той же папке проверьте файл и запустите его.

BASH
topaz check types.tpz
topaz run types.tpz

Проверка завершается с кодом 0. Программа выводит следующую строку.

Вывод
ready after 3 checks

Прочитайте типы параметров и результата

Функция описать принимает Стадия и int, а возвращает string. Тип функции (Стадия, int) -> string описывает те же параметры и результат. Он позволяет сохранить функцию в показать и вызвать её позже.

Топаз определяет тип int для проверки по начальному значению 3. Это вывод типа. Запись текущая: Стадия задаёт тип явно и называется аннотацией типа.

Имя Стадия обозначает объединение "draft" | "ready". Объединение допускает значение из любого перечисленного варианта. Здесь варианты заданы двумя строковыми литералами, поэтому другая строка, например "waiting", вызывает ошибку проверки типов. Чтобы исправить её, в файле types.tpz присвойте текущая значение "draft" или "ready".

Псевдоним type даёт существующему типу другое имя. Стадия и "draft" | "ready" обозначают один тип. Псевдоним не оборачивает значение в новую структуру.

Выберите тип по задаче

Что нужноЧто использовать
Локальное значение с понятным начальным типомВывод типа, как в let проверки = 3
Явные типы параметров и результатаАннотации типов
Один из нескольких типов или литераловОбъединение
Функция для хранения или передачи как значенияТип функции, например (int) -> bool
Разные типы даже при одинаковых полях или хранимых значенияхНоминальные типы record, enum, newtype

Номинальные типы различаются по объявлениям. Например, два отдельно объявленных типа записей различны даже при одинаковых полях. Создание значений и сопоставление с образцом описаны в разделе Записи и номинальные данные.

Базовые типы записываются строчными буквами int, float, bool, string. Единичный тип записывается как (), и его значение тоже (). Имя unit не является псевдонимом типа.

Коллекции используют Array<T>, Map<K, V> и Set<T>, где буквы обозначают типы. Например, Array<string> хранит строки. Используйте Option<T> для ожидаемого отсутствия значения и Result<T, E> для успеха или восстанавливаемой ошибки.

Укажите тип пустого значения

В пустом массиве нет элементов, по которым можно вывести тип. Для None тоже нужен тип возможного значения. Следующие объявления задают эти типы явно.

let имена: Array<string> = []
let выбранное: Option<int> = None

Первое объявление создаёт пустой массив строк. Второе создаёт Option<int> без значения. Нужный тип также могут задавать параметры функции, объявленный результат и окружающие выражения. Если тип остаётся неизвестным, проверяющий отклоняет значение.

Укажите точные аргументы типа

При записи типа указывайте столько аргументов типа, сколько требует объявление. Array<string> принимает один, а Map<string, int> принимает два. Базовые типы и параметры типа не принимают аргументов. То же правило действует для псевдонимов и пользовательских объявлений.

Обобщённые типы инвариантны. Расширение аргумента типа не делает типы коллекций взаимозаменяемыми. Например, Array<int> не является Array<int | string>.

Типы стандартной библиотеки template, JSONValue, File, Bytes, ByteBuffer, Path, Regex, Match, TOMLValue, URL, Date, BigInt, Decimal и RoundingMode не принимают аргументов типа. File обозначает тип ресурса, возвращаемого функцией open. Программа использует его операции без доступа к внутреннему представлению.

Другие правила типов

  • Между int и float нет неявного преобразования.
  • Объявляйте ограничения протоколов у параметров типа именованных функций. Раздел Функции и обобщения объясняет, как ограничения разрешают операции в теле функции.
  • Рекурсивные псевдонимы, аннотации вариантности, полиморфизм высших рангов и общая рефлексия не поддерживаются.

Перейдите к разделу Функции и обобщения, чтобы использовать эти типы в функциях. Для выбора способа представления отсутствующих значений и ошибок откройте Null, Option, Result и ошибки.