Строки, символы, логика и 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/() маркирует отсутствие результата; действия разделяются ;.
Проверьте себя
1. Каким оператором конкатенируют строки в OCaml?
A+
B^
C&
D.
2. Как записывается «не равно» в OCaml?
A!=
B<>
C/=
Dnot=
3. Чем особенны операторы && и ||?
AРаботают только с int
BЛенивые: правый операнд может не вычисляться
CВозвращают int
DНе существуют