Core floor фиксирует construction, conversion, доступ к скалярам текста, higher-order transforms, Option/Result helpers и profile-gated testing без скрытого coercion.
Канонический контракт
Prelude constructors: Some, None, Ok, Err; неразрешённым type variables нужен expected type. print принимает только string. toInt и conversion возвращают Option или объявленную ошибку, не exception. s.scalars() даёт строки из одного скаляра; у string нет .length. Free map, filter, reduce работают только с фиксированными iterable families.
Публичная поверхность
Inventory добавляет toIntRadix, fromCodePoint, toFloat, input, 13 Math members, string search/trim/split/slice/replace, Option okOr/okOrElse/map/flatMap, Result map/flatMap, Bytes/Encoding, hashes, форматы, Date, BigInt, Decimal и точные JSON decode heads.
Наблюдаемое поведение
String operations используют scalar semantics или явно названные byte semantics. Higher-order calls вычисляют inputs/callbacks в заданном порядке коллекции. Option.map и optional access сохраняют/уплощают Option; Result mapping не превращает fault в Err. Typed JSON требует один записанный полностью известный target и возвращает deterministic $-rooted path при data failure.
Текущая поддержка
Основные имена проверяются статически, а виртуальный корень std предоставляет фиксированный набор модулей. Функции print и input доступны только в средах, которые предоставляют необходимый ввод и вывод.
Ограничения и исключения
Нельзя печатать non-string без interpolation, выводить unconstrained None/empty collection, считать string массивом, предполагать user Iterable, ловить fault Result-helper, decode recursive/open/imported schemas или публиковать test helpers. assert — функция только test-profile, не keyword.
Пример
function parseAll(values: Array<string>) -> Array<Option<int>> {
return map(values, value => toInt(value))
}
let scalars = "토파즈".scalars()
let parsed = parseAll(["1", "x", "3"])
print("{scalars.length}:{parsed}")