Topazdocs
Встроенный справочник

Функциональная библиотека

Канонические public-example паттерны Topaz для функций высшего порядка, pipelines, значений Option и потоков Result.

Topaz держит public функциональную поверхность небольшой. Канонические примеры используют сигнатуры функций (конкретные или дженерик ранга 1), lambdas, конвейеры |>, optional access, match и распространение Result. Namespace-style extension blocks остаются отложенными, поэтому эта страница показывает прямые helper-паттерны.

Конкретные функции высшего порядка

Функции высшего порядка могут принимать или возвращать значения-функции. Topaz также поддерживает дженерик-объявления ранга 1 (см. страницу функций); этот cookbook держит свои helper-имена конкретными для ясности.

TOPAZ
function применитьДваждыКЦелому(преобразование: (int) -> int, значение: int) -> int {
    преобразование(преобразование(значение))
}

function множитель(коэффициент: int) -> (int) -> int {
    return (значение: int) => значение * коэффициент
}

let утроить = множитель(3)
let результат = применитьДваждыКЦелому(утроить, 5)

print("Результат: {результат}")  // 45

Фабрики замыканий

Lambda захватывает значения из lexical scope. Используйте этот паттерн для конкретных partial-application style helper-имён.

TOPAZ
function добавитьНа(количество: int) -> (int) -> int {
    return (значение: int) => значение + количество
}

let добавить10 = добавитьНа(10)
let сумма = добавить10(5)

print("Сумма: {сумма}")  // 15

Композиция функций

Составляйте шаги, прокачивая значение через них, или оборачивайте цепочку в лямбду, когда нужно переиспользуемое значение-функция.

TOPAZ
let удвоить = (x: int) => x * 2
let увеличить = (x: int) => x + 1
let меткаЦелого = (x: int) => "значение: {x}"

let обработать = (x: int) => x |> удвоить() |> увеличить() |> меткаЦелого()
let сообщение = обработать(5)

print(сообщение)  // "значение: 11"

Публичная идиома композиции в Topaz — конвейер |>, как выше. Специальный оператор композиции существует только на уровне SPEC и не входит ни в одну текущую поверхность profile. См. справочник операторов.

Pipelines

Используйте |>, когда значение должно пройти через ordinary helper calls. Передавайте piped value через _.

TOPAZ
let числа = Array.of(1, 2, 3, 4, 5, 6)

let сумма = числа
    |> filter(_, x => x % 2 == 0)
    |> map(_, x => x * x)
    |> reduce(_, 0, (накоплено, x) => накоплено + x)   // reduce(xs, initial, f)

print("Сумма: {сумма}")  // 56

Значения Option

Для optional records используйте ?., ?? и match. Не моделируйте эту страницу как отдельное namespace для Option helper-имён.

TOPAZ
let пользователь: Option<{ имя: string }> = Some({ имя: "Topaz" })
let отображение = пользователь?.имя ?? "guest"

print("Отображение: {отображение}")

match пользователь {
    case Some(текущийПользователь) => print("Пользователь: {текущийПользователь.имя}")
    case None => print("Нет пользователя")
}

Result pipelines

Используйте ? для распространения ошибок внутри функции, возвращающей Result, и match на границе, где обрабатывается успех или ошибка.

TOPAZ
function разделить(a: float, b: float) -> Result<float, string> {
    if b == 0.0 {
        Err("деление на ноль")
    } else {
        Ok(a / b)
    }
}

function вычислить(a: float, b: float) -> Result<float, string> {
    let частное = разделить(a, b)?
    Ok(частное + 1.0)
}

match вычислить(10.0, 2.0) {
    case Ok(значение) => print("Результат: {значение}")
    case Err(ошибка) => print("Ошибка: {ошибка}")
}

Выбор функции

Literal unions могут выбирать конкретное значение-функцию без custom variant declarations, strategy objects или generic sorting helper-имён.

TOPAZ
type РежимПреобразования = "double" | "square"

function выбратьПреобразование(режим: РежимПреобразования) -> (int) -> int {
    return match режим {
        case "double" => (x: int) => x * 2
        case "square" => (x: int) => x * x
    }
}

let преобразование = выбратьПреобразование("square")
let значение = преобразование(5)

print("Значение: {значение}")  // 25