Строки, символы, логика и unit
Разбираем остальные базовые типы: строки и их конкатенацию, символы, булеву логику и особенности типа unit.
string в OCaml — неизменяемая последовательность байтов; для построения строк используют оператор конкатенации
^, а не+.
После чисел познакомимся с типами, без которых не обходится ни одна программа: строками, символами и логикой. У каждого есть синтаксические особенности, которые удобно запомнить сразу.
Строки
Строковые литералы пишутся в двойных кавычках. Конкатенация — оператор ^ (не +, который занят целыми):
let greeting = "Привет, " ^ "мир!"
let len = String.length greeting (* int *)
let ch = greeting.[0] (* char *)
Строки неизменяемы. Для построения строк по частям эффективнее Buffer или Printf.sprintf, чем цепочка ^, потому что каждая конкатенация создаёт новую строку.
let name = "Аня"
let line = Printf.sprintf "Пользователь %s, id=%d" name 42
Символы char
Тип char — это один байт, литерал в одинарных кавычках: 'a'. Преобразования: Char.code 'A' даёт 65, Char.chr 66 даёт 'B'. Для полноценного Unicode используют отдельные библиотеки.
Логические значения
Тип bool со значениями true и false. Операторы: && (И), || (ИЛИ), not (НЕ):
let in_range x = x >= 0 && x <= 100
let valid s = not (String.equal s "")
Операторы && и || ленивые: если левый операнд && равен false, правый не вычисляется. Это позволяет безопасно писать x <> 0 && 100 / x > 1.
Структурное сравнение
Оператор = сравнивает значения структурно (по содержимому), а == — по физическому равенству. Почти всегда нужен =. «Не равно» — это <>, а не !=.
"abc" = "abc" (* true: одинаковое содержимое *)
[1; 2] = [1; 2] (* true *)
5 <> 6 (* true: не равны *)
Роль unit
Тип unit с единственным значением () отмечает «нет полезного результата». Несколько действий подряд разделяют точкой с запятой ;, и все, кроме последнего, должны иметь тип unit:
let report x =
print_string "Значение: ";
print_int x;
print_newline ()
Вывод:
Значение: 5
Как работает под капотом
Ленивость && и || — синтаксический сахар над if: a && b компилируется в if a then b else false. Структурное сравнение = реализовано полиморфной функцией, которая рекурсивно обходит значения; на функциях и циклических структурах = бросит исключение — важная деталь.
Частые ошибки
- Использовать
+для строк. Конкатенация — это^. - Писать
!=вместо<>. «Не равно» —<>;!=— физическое неравенство. - Менять символ строки. Строки неизменяемы; для изменяемого буфера есть тип
bytes.
Итоги
- Строки конкатенируются через
^; для форматирования удобенPrintf.sprintf. &&и||ленивы; структурное сравнение —=, «не равно» —<>.unit/()маркирует отсутствие результата; действия разделяются;.