Справочник стандартной библиотеки

По каждому глаголу: падежная рамка (роли аргументов — порядок свободен), что делает, сложность и пример. Пока раскрыт раздел «Потоки»; остальная стандартная библиотека добавляется сюда (см. руководство). Ленивое — считается по запросу, по одному элементу.

Колонка «сложность»для продвинутых: нотация «O(…)» показывает, сколько работы приходится на шаг (O(1) — дёшево, один элемент за раз; O(N) — по разу на каждый из N). Новичку читать её не обязательно.

Потоки — ленивые последовательности раздел руководства

Поток — ленивая, потенциально бесконечная последовательность (аналог Java Stream). Печатать поток целиком нельзя — сперва возьми конечное терминалом. Условие/действие — именованный глагол в творительном или инлайн через неявный оно (пример №114).

Генераторы — создают поток

Глагол (рамка)Что делаетСложностьПример
натуральныепоток 1, 2, 3, …O(1)/элементпервые 5 натуральных
натуральные от N от = источникпоток N, N+1, N+2, …O(1)/элементпервые 3 (натуральные от 10)
повторяй ДЕЙСТВИЕМ от НАЧАЛА твор. + отiterate: начало, f(начала), f(f(начала))…O(1)/элементповторяй удвоением от 1

Ленивые шаги — поток → поток (несовершенный вид)

Глагол (рамка)Что делаетСложностьПример
отображай ПОТОК ДЕЙСТВИЕМ объект + твор.map — применяет действие к каждому (лениво)O(1)/элементотображай натуральные квадратом
отфильтровывай ПОТОК УСЛОВИЕМ объект + твор.filter — оставляет подходящие (лениво)O(1)/подходящий*отфильтровывай натуральные, оно меньше 5

* фильтр может пропускать сколько угодно не-подходящих в поиске следующего подходящего; над бесконечным потоком без совпадений — не завершится (на площадке остановит лимит шагов).

Терминалы — берут конечное (короткое замыкание)

Глагол (рамка)Что делаетСложностьПример
первые N ПОТОКtake — первые N элементов → списокO(N)первые 10 натуральных
пока ПОТОК УСЛОВИЕМ объект + твор.takeWhile — пока условие истинно → списокO(длина префикса)пока натуральные, оно меньше 10
любой / все / никакой ПОТОК УСЛОВИЕМ и «из ПОТОКА»кванторы да/нет, стоп на первом решающемO(до решающего)любой из натуральных, оно больше 100

Заглянуть внутрь и склеить

Глагол (рамка)Что делаетСложностьПример
голова ПОТОКпервый элемент (посчитанный)O(1)голова натуральных → 1
хвост ПОТОКостаток — снова ПОТОКO(1)первые 3 (хвост натуральных)
спари ПОТОК с ПОТОКОМ объект + сzip — поток пар, стоп на короткомO(1)/элементспари поток с натуральными (нумерация)

Свёртка потока (сумма/сверни) — сперва материализуй терминалом (сумма (пока натуральные, оно меньше 10)): свёртка обязана пройти все элементы, а поток бесконечен. Первое подходящее = голова (отфильтровывай …). Печать целого потока — ошибка с подсказкой. Шаги конвейера чисты (эффектов в них не бывает) — печатай над готовым результатом.

Математические структуры раздел руководства

Новые числовые типы (комплексные, конечные поля, кватернионы) — обычные алгебраические структуры, а не «рунги» ядра. Автор объявляет структуру блоком <класс> <имя>: <поля> и её операции; операторы + − × ÷ над её значениями выводятся. Класс диктует, что обязательно и что законно:

КлассАвтор даётОператорыПример
кольцосложение, умножение, противоположное (ноль/единица — опц.) + − × (÷ → ошибка «в кольце нет деления»)матрицы 2×2 №125
поле+ ещё обратное+ − × ÷ комплексные №121, GF(5) №122
телокак поле, но × некоммутативно+ − × ÷ (правое деление) кватернионы №123

Конструктор — имя a и b, поле читается как глагол (вещ z), смешение с обычным числом — через операцию вложение (число «вкладывается» в структуру: 3 + 4 * i). Показ и равенство — свои или по умолчанию (покомпонентно).

ФормаЧто делаетПример
подключи библиотека «Имя»подключает библиотеку со структурами — и её типы доступны библиотека структур №124

Матрицы и массивы

Матрица — экземпляр класса кольцо над вложенным списком. Данные строят скобочным литералом [[0, -1], [1, 0]] (симметрично показу, синоним словесному всё:); отрицательные — унарным минусом -1; доступ к элементу чейнится сквозь «может быть» (сетка[i][j]). Как аргумент глагола литерал берут в скобки: матрица ([[…]]).

ФормаЧто делаетПример
[[a, b], [c, d]]скобочный литерал массива (вложенность любой глубины); -x — унарный минус массивы №126
рисунок <список>2D-«красивый» показ: высокие скобки ⎡⎣, колонки выровнены матрицы 2×2 №125
библиотека матриц n×m+ − × (× некоммутативно), транспонирование, определитель, элемент матрицы n×m №127

Агентский вид: матричный литерал [[…]] (≥2 строк) рисуется 2D-блоком ⎡⎣ прямо в исходнике; канон в файле — ASCII [[…]], при запуске сворачивается обратно.

Честно: это структуры с операторами, НЕ символьная алгебра (CAS). Законы (ассоциативность и т.п.) объявляем классом, не проверяем. Отложено: пользовательские классы, группы/алгебры над полем, тензоры (n-мерные), обратная матрица, общий определитель N×N.

Тестирование — встроено в язык пример №17

Тесты — часть языка (не библиотека): инлайн проверь: … должно …, именованные с таблицей случаев проверка «имя»: … , где:, покрытие глаголов, договоры требует/гарантирует.

ФормаЧто проверяет
проверь: X должно равняться Yравенство
… должно быть больше/меньше Y / > <сравнение (числа и строки)
… должно быть чётным/пустым/…предикат (§18)
… должно вызвать ошибкуожидание паники
проверка «имя»: … , где: таблицаdata-driven (по вердикту на строку)

Тестовые двойники (дублёры) пример №128

Для эффектного кода (зависит от репозитория/службы) — двойники по духу Spock, родной формой (Mockito/Spock — библиотеки; у нас — в языке). Интерпретатор-only.

ФормаЧто делаетSpock
заглушка [«Тип»] как <имя>создать двойникMock()
пусть <двойник> «метод» <арг…> → <знач>стаб ответа (любое=любой арг; иначе ничего)>>
проверь: <двойник> получил «метод» <арг…>verify ≥11 * m()
… получил «метод» … ровно N разverify счётаN * m()
<двойник> НЕ получил «метод» любоеverify «никогда»0 * m()
шпион <объект> как <имя>двойник вокруг реального: незастабленный зов → в настоящий (и пишется)Spy()

Двойник получает зов и стрелкой → отвечает. Два вида: заглушка (=Mock, поддельный) и шпион (=Spy, вокруг настоящего). Стаб пусть перебивает реальный зов и у шпиона.

Проверка свойств (property-based) пример №129

Свойство = ЗАКОН для любого входа; движок генерирует ~100 случайных примеров, ищет контрпример и сжимает его до минимального. Три бэкенда, фиксированный сид (воспроизводимо). Аналог QuickCheck.

ФормаЧто делает
свойство «имя»: для любого <ген> <var> …, <предикат>прогнать закон над генерацией
для любого целого а / любого целого от A до B агенератор целых (по умолч. / диапазон)
для любого логического агенератор да/нет
любой дроби а / любого плавающего прациональные / вещественные
любой строки с / строки до Nкороткие строки (малый алфавит)
любого списка целых сп / списка <эл> длины до Nсписки образцов элемента
… и любого <ген> <var>несколько переменных
генератор <имя>: <выражение>пользовательский генератор (по имени в связке)
выбор из [a, b, c]перечисление (сжатие к первому)
пара из (X) и (Y)2-кортеж (дуалис)
<конструктор> из (X)fmap — конструктор к образцам
свойство «имя» (N прогонов) (сид S):опции: число прогонов и сид ГПСЧ
при условии <предикат>,отбросить негодные входы (сжатие уважает)
отметь «метка», когда <предикат>,классификация — доля входов с меткой

Квантор любого — тот же корень, что матчер любое. Провал → отчёт печатает минимальный контрпример и сид. Честно: ПОИСК контрпримеров, а не доказательство.

Параллелизм (данный) пример №130

Наречие параллельно перед ФВП над коллекцией. Безопасно из-за чистоты; на JVM — по ядрам, прочие — последовательно (тот же результат). Общая память/замки — только внешнее на JVM.

ФормаЧто делает
параллельно отобрази <функция> <список>параллельный map (порядок сохранён)
параллельно отфильтруй <предикат> <список>параллельный filter (порядок сохранён)
параллельно: <имя — это выражение>, …структурный блок: независимые задачи разом, ждёт всех (пустая строка после)
поручи <выражение>пустить задачу → обещание (результат позже)
дождись <обещание>забрать результат (ошибка задачи всплывает тут)

Задачи ЧИСТЫ (без ввода-вывода); ошибка — первой по порядку. Далее: каналы, акторы + реактивные события.