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

Функции и обобщения

Каноническая грамматика, семантика, ограничения и отложенные границы: Функции и обобщения.

Именованные функции, лямбды, defaults, variadic, rank-1 generics, static protocol bounds, named arguments и call spread используют единый порядок вычисления слева направо.

Политика

Функция объявляет типы параметров и необязательный тип результата; последнее выражение body может вернуть значение. Параметры immutable. Default — literal или const-expression, вычисляемый при пропуске и не ссылающийся на другой параметр. Последний variadic записывается ...name: T и получает Array<T>. Лямбда использует => и выводит конкретные типы из контекста. Параметры типов именованной функции дают rank-1 polymorphism.

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

Вызов вычисляет callee один раз, затем positional/spread arguments слева направо и после них связывает named arguments. Array spread допустим только после fixed parameters и только в variadic tail. Полный список explicit type arguments задаёт inference до value arguments и expected result и обязан согласоваться со всеми доказательствами. Generic function может требовать неупорядоченную конъюнкцию допущенных static protocols, а body получает ровно объявленные bounds.

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

Отклоняются args: ...T, не последний variadic, positional после named, spread в fixed parameter, iterable/tuple spread, повторные или отсутствующие arguments и анонимное выражение function(...) {}. Bounds нельзя объявлять у лямбд, alias, nominals, function types, receiver и protocol methods. Частичная instantiation, type arguments у monomorphic/unresolved head и не объявленный более сильный bound — статические ошибки.

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

Higher-rank polymorphism, generic lambdas, variance, default type parameters, generic receiver methods, dynamic protocol dispatch, произвольные trait constraints и широкие first-class polymorphic values отложены. Обычные explicit type arguments стираются; runtime schema материализуют только допущенные typed-JSON heads.

Пример

TOPAZ
function head<T>(values: Array<T>) -> Option<T> {
    match values {
        case [] => None
        case [first, ..] => Some(first)
    }
}

let first: Option<int> = head([1, 2, 3])

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