Перейти до вмісту

OCaml

Матеріал з K2 ERP Wiki

</syntaxhighlight>

module Make_set (Ord : ORDERED) = struct

</syntaxhighlight> let point = (10, 20)

OCaml активно використовує функції вищого порядку. Такі системи часто потребують:

match status with
  • експериментів;
  • навчання;
  • перевірки функцій;
  • дослідження типів;
  • інтерактивної роботи з бібліотеками;
  • REPL-driven development. так само часто зустрічаються:

let add (a : int) (b : int) : int =

Коли варто використовувати OCaml

  • боротися з type errors замість розуміння моделі типів;
  • забувати, що `=` — structural equality, а `==` — physical equality;
  • плутати lists і arrays;
  • використовувати exceptions там, де краще Result;
  • не опрацьовувати всі variants;
  • створювати занадто загальні string/int коди замість ADT;
  • зловживати mutable state;
  • не розуміти currying;
  • неправильно застосовувати часткове сценарії використання;
  • ускладнювати модулі й functors на ранньому етапі;
  • ігнорувати warnings;
  • не використовувати Dune/opam стандартним способом.</syntaxhighlight>
List.filter (fun x -> x mod 2 = 0) numbers

</syntaxhighlight> ! * Menhir documentation. match xs with exception Invalid_input of string

let evens =

`fold` корисний для:

</syntaxhighlight>

Приклад:

Lists

ReasonML — альтернативний синтаксис для OCaml, який був створений, щоб зробити OCaml-підхід ближчим до JavaScript/React-розробників. Поширені помилки:

let result = Math_utils.add 2 3

* algebraic data types добре описують AST;
* pattern matching зручний для обходу дерев;
* strong typing зменшує помилки;
* modules допомагають структурувати phases;
* recursion природна для tree processing;
* type inference зручна для складних алгоритмів. Pattern matching по списку:

<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">

let numbers = [1; 2; 3]
}

! Основна ідея: OCaml дає можливість описувати складну логіку через типи, pattern matching і функції так, щоб багато помилок знаходилися ще до запуску програми. List.map (fun x -> x * 2) numbers

Records

Tuple групує кілька значень без іменованих полів.== Standard library ==

let () = c.value <- c.value + 1 </syntaxhighlight>

  • compiler development;
  • static analysis;
  • formal methods;
  • theorem proving tools;
  • financial software;
  • backend services;
  • domain-specific languages;
  • developer tools;
  • symbolic computation;
  • verification tools;
  • interpreters;
  • parsers;
  • type checkers;
  • research prototypes;
  • high-assurance software;
  • систем зі складною бізнес-логікою. компонент із signature:
== Polymorphic variants ==
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
let activate user =
'''Суть fold:''' це універсальний спосіб пройти колекцію й накопичити результат.<syntaxhighlight lang="ocaml">

! let add a b =
<syntaxhighlight lang="ocaml">
</div>
  • compiler development;
  • interpreters;
  • static analysis;
  • formal methods;
  • DSL;
  • фінансової логіки;
  • складних state machines;
  • backend-сервісів із високою вимогою до коректності;
  • tools для розробників;
  • parsers;
  • type checkers;
  • symbolic computation;
  • proof-related tooling;
  • систем, де критично моделювати всі стани через типи.
val add : int -> int -> int Об’єкти в OCaml можуть бути корисними для: let add a b =
module Math_utils = struct
== Приватність даних ==
object
Обробка:

<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

'''Головна перевага:''' OCaml дає можливість точно описувати структури даних і стани системи так, щоб компілятор допомагав підтримувати коректність. let sum = x + y
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<syntaxhighlight lang="ocaml">

</div>

Приклад:

 in

* логами;
* telemetry;
* serialized data;
* database records;
* API payloads;
* secrets;
* tokens;
* config files;
* test fixtures;
* crash reports;
* debug output;
* financial data. let () = counter := !counter + 1

== Типові помилки початківців ==

Приклад:
== Перша програма на OCaml ==
== Значення і let ==

Компілятор розуміє, що `add` функціонує з цілими числами, бо використано оператор `+`.== Джерела ==
Приклад:
 loop 0 xs
 | [] -> 0
 | x :: rest -> x + sum rest
let x = 10

Pattern matching:

let rec eval expr =
OCaml має бібліотеки для асинхронного програмування. | Ok of 'a
 | Error of 'e
 active : bool;

 else Ok (a / b)

'''Практична роль:''' ReScript виступає як окремішим напрямом для typed JavaScript/frontend, але має корені в OCaml-екосистемі. у поєднанні виразності, суворої типізації, компактного синтаксису й потужної модульної системи виступає ключовою рисою OCaml виступає як практичною функціональною мовою, яка підтримує так само імперативний і обєктний стиль. Haskell
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
== OCaml і F# ==

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
`let` створює binding. Тип функції:
let sum xs =
with

 name : string;
'''Практична роль:''' immutable values допомагають писати передбачуваніший код без випадкових змін стану. |-
| Обчислення
| Strict за замовчуванням
| Lazy за замовчуванням
|-
| Типізація
| Статична, type inference
| Статична, дуже потужна type system
|-
| Практичність
| Часто більш прагматичний стиль
| Більш чистий функціональний стиль
|-
| Effects
| Доступні напряму
| Контролюються через type system і abstractions
|-
| Основні асоціації
| Compilers, tools, finance, formal methods
| Research, FP, compilers, type-level programming
|}

<syntaxhighlight lang="ocaml">
== ReScript ==
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

== Exhaustiveness checking ==

'''Історична роль:''' ReasonML показав, що типова платформа й функціональний стиль OCaml можуть використовуватися в frontend і JavaScript-контексті. Критерій
'''Головна думка:''' OCaml  це мова для точного моделювання даних і станів. Python
'''Висновок:''' F# переносить ML-ідеї у .NET-світ, а OCaml має власну екосистему й сильну роль у компіляторах, формальних інструментах і native tooling. Обробка:

OCaml оптимізує уникати частини помилок через типи, але безпека системи залежить від архітектури. Dune застосовується для для:
}
|-
| Платформа
| Native, bytecode, OCaml runtime
| .NET
|-
| Походження
| ML-сімейство
| ML-сімейство, інтеграційні функції ERP з .NET
|-
| Типізація
| Статична, type inference
| Статична, type inference
|-
| ERP-платформа
| opam, dune, OCaml libraries
| .NET ecosystem
|-
| Основні ніші
| Compilers, formal tools, finance, systems tooling
| .NET applications, data, enterprise, functional .NET
|}

OCaml застосовується для в частині фінансової індустрії.== Multicore OCaml ==

dune build

* паралельного виконання;
* concurrent programming;
* масштабування на кілька ядер;
* high-performance services;
* нових runtime-можливостей;
* structured concurrency;
* effect handlers.

end </syntaxhighlight>

Приклади модулів:

Парсери і компілятори

Приклад:

</syntaxhighlight>

* Документація Jane Street Base/Core. * OCaml Manual. Критерій

Головна перевага Option: відсутність значення стає явною частиною типу, а не прихованим null.</syntaxhighlight> Приклад із функцією: let x = 10 + "text"

let find_user id =

 type t

Тут `Failed` містить додаткове значення  причину помилки.== конкурентні переваги OCaml ==

</div>
OCaml дуже часто використовують для парсерів, компіляторів і мовних інструментів. let rec sum xs =

<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
 name = "Alice";
</div>
Тепер `add_ten 5` поверне `15`. Оригінальний `alice` не змінюється. type 'a option =

val add : int -> int -> int = <fun>

</div>

<syntaxhighlight lang="ocaml">
<syntaxhighlight lang="ocaml">
</div>
OCaml і F# мають спільну ML-спадщину. add 10
'''Практична роль:''' opam дає можливість керувати версіями OCaml і залежностями проєкту.

let rec length xs =

`Ok -> "ok" `Error message -> "error: " ^ message
match xs with
</div>
type status =
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

} [@@deriving show]

== Для чого застосовується для OCaml ==

let status_label status =

end
== UTop ==
opam switch create 5.1.0
 a + b
'''Практична роль:''' Async і Lwt дозволяють будувати асинхронні сервіси й I/O-heavy застосунки в OCaml. a + b

!
  • input validation;
  • помилки бізнес-логіки;
  • unsafe features;
  • FFI з C;
  • serialization;
  • dependency risks;
  • secrets;
  • logging sensitive data;
  • network input;
  • parser vulnerabilities;
  • authorization;
  • concurrency bugs;
  • configuration errors. val square : int -> int
Особливості синтаксису:
dune exec ./main.exe
let describe_list xs =
== Arrays ==
'''критично:''' PPX здатна зменшити boilerplate, але надмірне використання синтаксичних розширень ускладнює читання коду. OCaml

'''критично:''' у OCaml-проєктах потрібно розуміти, чи застосовується для стандартна бібліотека, Base/Core або інший набір бібліотек, бо API можуть відрізнятися. OCaml
</div>
 | New -> "New"
 | Active -> "Active"
 | Blocked -> "Blocked"
 | Closed -> "Closed"

критично: OCaml — не лише академічна мова.</syntaxhighlight>

  • generic modules;
  • reusable data structures;
  • dependency injection на рівні модулів;
  • type-safe abstractions;
  • parametrized libraries. OCaml здатна бути не найкращим вибором для:

let divide a b = let older_alice =

Практична роль: анонімні функції зручні для короткої логіки, яку передають у функції вищого порядку. age : int;

else Ok (a / b)

let age = 25

</syntaxhighlight>

val compare : t -> t -> int

Практична роль: Dune виступає як стандартним інструментом збірки для більшості сучасних OCaml-проєктів. Критерій

Option

Синтаксис

Приклад:

Pending Paid Failed of string Refunded
age : int;

Практична роль: signatures дозволяють точно описати, що компонент відкриває назовні, і приховати зайві деталі реалізації. ! method increment = Pattern matching — одна з головних можливостей OCaml.</syntaxhighlight> opam install core

=== Обробка статусу ===

let label s =

Функції вищого порядку дозволяють:

* сильна типізація;
* компактність;
* коректність складної логіки;
* швидкий native code;
* контроль помилок;
* зручність моделювання варіантів стану;
* good tooling для великих codebase;
* технічна підтримка production libraries у певних екосистемах.== Загальний SEO-опис ==
<syntaxhighlight lang="ocaml">
Сучасний OCaml має дорожня карта розвитку у напрямі multicore і effects.<syntaxhighlight lang="ocaml">
 | Int n -> n
 | Add (a, b) -> eval a + eval b
 | Mul (a, b) -> eval a * eval b
== Menhir ==

'''Практична роль:''' Menhir виступає як важливим інструментом OCaml-екосистеми для проєктів, повязаних із мовами програмування й парсингом.<syntaxhighlight lang="ocaml">
 else value
! Це означає, що функція з кількома аргументами фактично приймає один аргумент і повертає нову функцію. '''Menhir'''  parser generator для OCaml. let name = alice.name

let rec eval expr =

  • написання компіляторів;
  • створення інтерпретаторів;
  • статичний аналіз коду;
  • формальна верифікація;
  • фінансові системи;
  • trading systems;
  • DSL;
  • backend-сервіси;
  • парсери;
  • type checkers;
  • proof assistants;
  • аналіз протоколів;
  • data transformation;
  • складна доменна логіка;
  • research tools. | Int of int
Add of expr * expr Mul of expr * expr
== Статична типізація ==

'''Перевага:''' OCaml добре підходить для коду, де структура даних, варіанти станів і правила перетворення мають бути точними й перевірюваними. Приклад:

</div>

* сумування;
* агрегації;
* побудови maps;
* обробки подій;
* перетворення AST;
* накопичення результатів. Це означає, що binding не змінюється після створення.</div>
<syntaxhighlight lang="bash">
Функції в OCaml створюються через `let`. Scala

* розширені модулі;
* зручні API;
* більш послідовний стиль;
* додаткові типи;
* функції для production;
* utilities для великих codebase.

історія продукту OCaml

type payment_status = Приклад:

Висновок: Scala сильніша в JVM enterprise/backend, а OCaml — у ML-style функціональній розробці, модулях і мовних інструментах. type status =

== OCaml і Python ==

! Приклад AST:

Приклад команди:

* передавати поведінку як аргумент;
* комбінувати перетворення;
* уникати дублювання;
* писати декларативний код;
* будувати pipelines. {| class="wikitable"

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

* `let` створює binding;
* `greet`  функція;
* `^` об’єднує рядки;
* `let () =` часто застосовується для для коду з побічними ефектами;
* `print_endline` виводить рядок. "Hello, " ^ name
 | [] -> "empty"
 | _ :: _ -> "not empty"
OCaml історично пов’язаний із частиною екосистеми theorem proving, зокрема з інструментами, які використовують ML-підхід.== Jane Street Core ==
Приклад:
<syntaxhighlight lang="ocaml">

</div>

Використання:

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
New Active Blocked Closed Головна сила ADT: можна описати доменні стани точно, без неявних рядків, числових кодів або nullable-полів. OCaml
  • точного моделювання термів;
  • pattern matching;
  • рекурсивної обробки дерев;
  • сильної типізації;
  • модульності;
  • надійного compiler/runtime.</syntaxhighlight>

Типові сценарії використання OCaml:

Coq і OCaml

  • OCaml type system;
  • JavaScript ecosystem;
  • BuckleScript / ReScript історією;
  • React-подібним frontend;
  • альтернативним синтаксисом. let greet name =

Functors

match divide 10 2 with

</syntaxhighlight>

  • сильній статичній типізації;
  • type inference;
  • pattern matching;
  • algebraic data types;
  • модульній системі;
  • native compiler;
  • використанню в research і compiler tooling;
  • застосуванню в промислових фінансових системах;
  • зв’язку з формальними методами й theorem proving. match expr with

UTop — зручний interactive toplevel для OCaml.== Висновок == type direction =

Функції

Доступ до поля:

* компіляції;
* запуску тестів;
* опису libraries;
* опису executables;
* інтеграції з opam;
* генерації документації;
* підтримки великих проєктів;
* watch mode;
* cross-package builds. !
`fold` згортає список в одне значення.<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">

!== OCaml і Haskell ==

== Recursion ==

OCaml підтримує exceptions. OCaml застосовується для для:

'''Core'''  альтернативна стандартна бібліотека від Jane Street. if b = 0 then Error "division by zero"
 let square x = x * x

 let equal a b = Ord.compare a b = 0

'''Головна роль modules:''' вони дозволяють структурувати код і явно відокремлювати інтерфейс від реалізації. Вона особливо сильна в задачах, де потрібно точно моделювати складні стани, писати компілятори, аналізатори, формальні інструменти, фінансову логіку або надійні backend-компоненти. '''Практична порада:''' OCaml варто обирати, коли типи, ADT, pattern matching і модульність прямо допомагають зменшити складність проєкту. * Dune documentation.

Signatures

'''Увага:''' multicore OCaml  важливий сучасний напрям, але конкретні підходи в проєкті залежать від версії компілятора й бібліотек. Критерій
== Higher-order functions ==
<syntaxhighlight lang="ocaml">
=== AST і обчислення виразу ===

Вони використовуються для:

Приклад:

int -> int -> int

Приклад:

Приклад:

</syntaxhighlight> Тип: let squares = List.map (fun x -> x * x) numbers OCaml і Haskell обидві виступає як функціональними мовами, але мають різну філософію. компіляторів забезпечується через OCaml застосовується для; так само реалізовано статичного аналізу, формальних методів, фінансових систем, backend-сервісів, інструментів розробника, DSL, research software, верифікації, систем із високою вимогою до коректності й складної доменної логіки. Її головна сила.</syntaxhighlight>

Variants

критично: mutable state у OCaml доступний, але його краще локалізувати й використовувати там, де він справді потрібен.

let square =

OCaml походить із ML-сімейства мов програмування. Records immutable за замовчуванням.

Фінансові системи

Виклик:

'''Небезпека:''' якщо в OCaml моделювати домен лише рядками й числами, втрачається значна частина переваг мови. match status with
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

</div>

<syntaxhighlight lang="ocaml">

<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">

<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
OCaml добре підходить для:

let describe_number n =

match expr with

`_` означає будь-яке інше значення. age = 25;

match xs with
let add a b = a + b
match n with

</syntaxhighlight> Перевага: immutable records зменшують ризик випадкової зміни даних у різних частинах програми. let rec loop acc xs =

Результат  `10`. '''Суть функцій:''' OCaml-функції зазвичай приймають аргументи без дужок і швидко комбінуються між собою. List  одна з базових структур OCaml. * Матеріали щодо ML-сімейства мов, type inference, algebraic data types, modules, functors, compiler development і formal methods. let divide a b =
</div>
type expr =

</div>
== Modules ==
'''Правило:''' типобезпечний код усе одно здатна випадково записати або передати чутливі інформаційні дані, якщо неправильно спроєктовані логи, API або конфігурація. | Invalid_input message -> print_endline message
 name : string;

== OCaml і Rust ==
<syntaxhighlight lang="ocaml">
match s with

Значення в OCaml за замовчуванням immutable. let y = 20

Arrays корисні для:

name : string;
  • менша популярність, ніж у Python, Java, JavaScript або Rust;
  • менша кількість розробників;
  • менша ERP-платформа для web і AI;
  • незвичний синтаксис для OOP/imperative-розробників;
  • складна модульна ERP платформа для новачків;
  • functors можуть бути важкими для старту;
  • кілька стандартних бібліотечних стилів;
  • tooling менш масове, ніж у великих mainstream мовах;
  • GC здатна бути небажаним у деяких low-level системах;
  • onboarding команди потребує часу. let numbers = [1; 2; 3; 4; 5]
'''Критично:''' сильна типізація не замінює threat modeling, security review, тестування й контроль залежностей. end

* performance-sensitive code;
* mutable buffers;
* numeric algorithms;
* indexing;
* low-level data;
* взаємодії з бібліотеками. age : int;

</div>
== Fold ==
Обробка:

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
 List.fold_left (fun acc x -> acc + x) 0 [1; 2; 3; 4]
</div>
let active = true
</div>

let add a b =
== Tail recursion ==

<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">

* extensible interfaces;
* GUI;
* plugin-like systems;
* бібліотек;
* випадків, де structural object types зручні.== Pattern matching ==

let add_ten =

</syntaxhighlight>

Обмеження OCaml

</div>
'''Result''' застосовується для для операцій, які можуть завершитися успіхом або помилкою. '''Практична роль:''' рекурсія природно поєднується зі списками, trees, AST і pattern matching. * створення парсерів;
* компіляторів;
* DSL;
* мовних інструментів;
* статичного аналізу;
* складних граматик. Tail recursion дає можливість компілятору оптимізувати рекурсивні виклики.== Хороші практики OCaml ==

</div>
<syntaxhighlight lang="ocaml">
OCaml має обмеження.</div>
== OCaml і Scala ==
'''Сильна сторона OCaml:''' functors дають потужну модульну абстракцію, яку складно прямо повторити в багатьох інших мовах.</div>

</div>
</div>
'''критично:''' OCaml не дає можливість багатьом неочевидним runtime-помилкам дійти до виконання програми. numbers.(0) <- 10

dune test

Практична роль: OCaml особливо сильний там, де критично явно змоделювати всі можливі стани й не забути жоден варіант під час обробки.

}

  • `Async`;
  • `Lwt`.
  1. let add a b = a + b;;
<syntaxhighlight lang="ocaml">

</div>
== Mutability ==
Приклад ідеї:

Список виступає як immutable і однозвязним. if id = 1 then Some "Alice" else None

 a + b

== Formal methods ==

let numbers = [1; 2; 3; 4; 5]

* deriving functions;
* serialization;
* тестів;
* code generation;
* annotations;
* boilerplate reduction;
* library-specific syntax.

</syntaxhighlight> Обробка:

Основна ніша Functional programming, compilers, formal tools, finance Systems programming, memory safety, infrastructure
Memory management Garbage collector Ownership і borrow checker
Типи ADT, pattern matching, modules, inference ADT, pattern matching, traits, ownership
Runtime OCaml runtime з GC Без GC
Low-level контроль Обмеженіший Сильний

Приклад помилки:

критично: у фінансовому коді типи можуть допомагати не змішувати різні сутності: валюти, інструменти, стани ордерів, результати валідації й помилки.

Безпечне ділення через Result

 { user with active = true }
Приклад:
 | None
 | Some of 'a
 print_endline value

<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

Це критично для:
 mutable value : int;

</syntaxhighlight>

</syntaxhighlight> try

Some name -> print_endline name None -> print_endline "Not found"

let total =

Приклади: </syntaxhighlight>

Увага: OCaml підтримує OOP, але провідний стиль мови зазвичай функціональний і модульний.== Async і Lwt ==

OCaml часто зустрічається поруч із формальними методами й verification tools.
Int n -> n Add (a, b) -> eval a + eval b Mul (a, b) -> eval a * eval b

</syntaxhighlight>

Помилка: обирати OCaml лише через “функціональність”, не враховуючи командний досвід, екосистему й вимоги deployment. if value = "" then raise (Invalid_input "empty input")

  • network services;
  • concurrent I/O;
  • servers;
  • clients;
  • background tasks;
  • event loops;
  • non-blocking operations. Приклад:

Об’єктна платформа

let square x = x * x

let parse value =

</syntaxhighlight>

PPX

}

Ok value -> Printf.printf "Result: %d\n" value Error message -> Printf.printf "Error: %s\n" message

OCaml має об’єктну систему, хоча багато OCaml-коду пишеться без класичного OOP. Menhir застосовується для для:

Причини:
ReScript виник із BuckleScript/ReasonML-напряму й орієнтований на typed frontend development, який компілюється в JavaScript.

Суть list: списки добре підходять для рекурсивної обробки, але не виступає як найкращим вибором для частого доступу за індексом. * theorem provers;

  • proof assistants;
  • static analyzers;
  • model checkers;
  • symbolic execution tools;
  • formal semantics;
  • сертифікаційні інструменти;
  • аналіз мов програмування. Її сила розкривається тоді, коли типи, ADT і pattern matching стають частиною дизайну системи. OCaml — це функціональна мова програмування з родини ML, яка поєднує сильну статичну типізацію, type inference, pattern matching, algebraic data types, модулі, functors, immutable data і можливість компіляції у швидкий native code.

Практична роль: records зручні для доменних об’єктів, конфігурацій, результатів і структурованих даних.== Dune == Приклад:

Платформа Native/bytecode OCaml JVM
Типізація Статична, type inference Статична, потужна type system
Стиль ML, modules, ADT FP + OOP, traits, JVM ecosystem
ERP-платформа Менша, нішевіша Ширша JVM-екосистема
Основні ніші Tools, compilers, formal methods Backend, data, enterprise JVM

Компілятор попередить, що не оброблено `Blocked` і `Closed`.== Result ==

Рекомендовано:

Приклад:

Algebraic data types або ADT дозволяють описувати типи як набір варіантів.

let c = { value = 0 }

| New
| Active
| Blocked
| Closed

end

| New -> "new"
| Active -> "active"

Практична роль: OCaml часто застосовується для там, де мова програмування сама стає інструментом для аналізу інших мов, доказів або формальних моделей. F#

Можливі проблеми:

class counter =

</syntaxhighlight> let turn_back direction =

</syntaxhighlight>

Практична роль: стандартна бібліотека дає базові структури й функції, але в production-проєктах часто використовують додаткові бібліотеки. Functors використовуються для:

  • Base;
  • Core;
  • Core_kernel;
  • Async.== Тематичні мітки ==

let counter = ref 0

OCaml став відомим через: Приклад:

* групування функцій;
* namespace;
* приховування реалізації;
* API boundaries;
* великих codebase;
* reusable components;
* generic programming через functors. Це означає, що багато помилок типів знаходяться під час компіляції. Приклад:

== ReasonML ==

 value <- value + 1

 method value =
 value
 end

end Суть OCaml: pattern matching дає можливість явно описувати обробку різних форм даних. * `List`;

  • `Array`;
  • `String`;
  • `Map`;
  • `Set`;
  • `Hashtbl`;
  • `Option`;
  • `Result`;
  • `Seq`;
  • `Printf`;
  • `Sys`;
  • `Unix`. Практична порада: для великих списків варто писати tail-recursive функції, щоб уникнути переповнення стеку.== Коли OCaml здатна бути невдалим вибором ==
active = true;

Простий приклад: Приклад:

val mutable value = 0

Приклад:

<syntaxhighlight lang="ocaml">

<syntaxhighlight lang="ocaml">
<syntaxhighlight lang="ocaml">
! '''Перевага синтаксису:''' OCaml дає можливість писати коротко, але зберігати сувору типову перевірку. Приклад:
</div>
type user = {

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

== Currying ==

</div>

OCaml і Rust мають різні ніші, але обидві приділяють велику увагу типам. !</div>

let doubled =

</div>
'''Підказка:''' в OCaml-прикладах критично дивитися на типи, variants, pattern matching і те, чи всі можливі стани оброблені. let value = parse "" in

Приклад:

let numbers = [|1; 2; 3|]
ReScript має власний синтаксис і екосистему, але історично повязаний з OCaml-ідеями. Приклад ідеї:
 fun x -> x * x
{{SEO
|title=OCaml  функціональна мова програмування для ML-сімейства, типобезпеки, компіляторів і надійних систем
|description=OCaml  Wiki-стаття про функціональну мову програмування ML-сімейства з сильною статичною типізацією, type inference, pattern matching, algebraic data types, modules, functors і native compilation. Розглянуто синтаксис OCaml, функції, варіанти, records, modules, signatures, functors, exceptions, Option, Result, dune, opam, Jane Street Core, ReasonML, компілятори, формальні методи, переваги, обмеження і хороші практики.
|keywords=OCaml, мова програмування OCaml, OCaml programming language, ML language, functional programming, static typing, type inference, pattern matching, algebraic data types, ADT, modules, functors, signatures, records, variants, opam, dune, Jane Street Core, ReasonML, compiler development, formal methods, програмування
|alternativeTo=динамічно типізовані скрипти для складної логіки; мови без type inference; складні runtime-помилки через неявні типи; verbose Java/C# код для доменної логіки; небезпечні моделі стану без immutable data; ручне моделювання sum types; частина задач компіляторів і формальних інструментів без ML-підходу
}}

'''Суть прикладу:''' OCaml-код часто складається з маленьких функцій, які приймають значення й повертають нові значення.
OCaml виступає як статично типізованою мовою.
Потрібно обережно працювати з:

match find_user 1 with

type ('a, 'e) result =
<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
 | North
 | South
 | East
 | West
<syntaxhighlight lang="ocaml">

Mutable record field:

Приклад:
<syntaxhighlight lang="ocaml">
== Див. так само ==
 | North -> South
 | South -> North
 | East -> West
 | West -> East
{| class="wikitable"

print_endline "Hello, world!"
let () =
Приклад:

Поширені варіанти:

== Type inference ==

 match xs with

'''Functor'''  це компонент, який приймає інший компонент як аргумент і повертає новий компонент. '''OCaml'''  це функціональна мова програмування ML-сімейства, яка поєднує сильну статичну типізацію, type inference, algebraic data types, pattern matching, modules, signatures, functors і native compilation. '''Практична порада:''' якщо значення має багато полів або важливі назви полів, краще використовувати record, а не tuple.<syntaxhighlight lang="ocaml">

* Офіційна документація OCaml.</div>
'''opam'''  package manager для OCaml.== Анонімні функції ==
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
 print_endline (greet "Alice")

'''Увага:''' arrays у OCaml mutable, тому їх потрібно використовувати свідомо й не змішувати з immutable data без потреби. ReasonML повязаний із:
'''Module'''  ключовий інструмент організації OCaml-коду. Тип:
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
 a + b

== Приклади задач на OCaml ==

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
'''Висновок:''' Python швидший для старту й має ширшу екосистему, а OCaml дає сильніші compile-time гарантії для складної логіки. type item = Ord.t

`rec` потрібен для рекурсивної функції.<syntaxhighlight lang="ocaml">

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
== opam ==
<syntaxhighlight lang="ocaml">
<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">

OCaml не виступає як наймасовішою мовою для web, AI або швидких скриптів, але її типова платформа й модульність дають значну перевагу в проєктах, де коректність логіки важливіша за ширину екосистеми. Критерій

PPX — платформа синтаксичних розширень OCaml. type counter = {

active : bool;

Практична роль: Result дає можливість моделювати помилки без exceptions і змушує явно їх опрацьовувати. Приклад:

References:
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

Modules використовуються для:

Рекурсивна обробка списку

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

* коротких груп значень;
* координат;
* проміжних результатів;
* пар;
* простих return values. '''Перевага currying:''' можна швидко створювати спеціалізовані функції через часткове сценарії використання аргументів.<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
OCaml має стандартну бібліотеку з базовими модулями.</div>

'''Практична роль:''' UTop оптимізує оперативно перевіряти ідеї й бачити inferred types. let (x, y) = point
<syntaxhighlight lang="ocaml">
type expr =

OCaml так само має polymorphic variants. let alice = {
let name = "Alice"
'''Головна перевага:''' OCaml дає конкурентні переваги статичної типізації без потреби постійно писати типи вручну.</div>

</div>

Рекурсія часто застосовується для в OCaml замість класичних циклів.<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">

'''Type inference''' означає, що компілятор часто сам виводить типи без явного зазначення. Вона застосовують, коли потрібно і в production-системах, особливо там, де важлива коректність складної логіки. Приклад:
== Algebraic data types ==

'''Record'''  це тип із іменованими полями. Приклад:
'''Signature''' описує інтерфейс модуля. OCaml

'''Практична роль:''' OCaml добре підходить для інструментів, які працюють із формальними структурами, типами, логікою й деревами синтаксису. Назва повязана з Objective Caml  розвитком Caml із підтримкою обєктної системи та практичних інструментів для розробки. Потрібно контролювати:

* сильна статична типізація;
* type inference;
* algebraic data types;
* pattern matching;
* exhaustiveness checking;
* modules;
* signatures;
* functors;
* native compilation;
* immutable data за замовчуванням;
* компактний синтаксис;
* хороша придатність для компіляторів;
* зручність для формальних інструментів;
* Option і Result для безпечнішого моделювання;
* продуктивний функціональний стиль.<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

</div>
Core надає:
module Math_utils : MATH_UTILS = struct
 | 0 -> "zero"
 | 1 -> "one"
 | _ -> "many"
Polymorphic variants гнучкіші за звичайні variants, але можуть ускладнювати типи.<syntaxhighlight lang="ocaml">

Variants  це варіанти ADT.

Option застосовується для для значення, яке здатна бути відсутнім. OCaml-функції зазвичай виступає як curried.

через критично: exhaustiveness checking користувачі можуть не забути нові або рідкісні стани системи. критично: OCaml сильний у складній логіці й типобезпечному моделюванні, але не завжди виступає як найпрагматичнішим вибором для масових web або data science задач. * opam documentation.

оновлення версій records

</syntaxhighlight>

opam застосовується для для:
</div>

Висновок: Rust краще підходить для low-level systems, а OCaml — для виразного моделювання логіки, компіляторів і функціонального коду з GC. * Документація Lwt і Async. Практична роль: variants зручні для статусів, команд, станів протоколу, AST, подій і результатів операцій. Причини:

 let add a b = a + b
Висновок: Haskell сильніший у чистому FP і type-level abstraction, а OCaml часто сприймають як більш прагматичну ML-мову.

Такий код не пройде типову перевірку, бо не можна додавати число й рядок. Rust

  • встановлення компілятора;
  • керування пакетами;
  • створення switches;
  • ізоляції середовищ;
  • встановлення бібліотек;
  • dependency resolution;
  • інтеграції з Dune.
    '''Dune'''  основна build system для сучасних OCaml-проєктів. * Real World OCaml. type user = {
    let result = add 2 3
    === Record користувача ===
    
    Він застосовується для для:
    
    <div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
    
    * моделювати домен через ADT;
    * використовувати pattern matching;
    * не ігнорувати compiler warnings;
    * вмикати суворіші warnings у важливих проєктах;
    * використовувати Option замість null-подібних домовленостей;
    * використовувати Result для очікуваних помилок;
    * робити records зрозумілими;
    * розділяти modules і signatures;
    * не ускладнювати functors без потреби;
    * писати тести;
    * тримати mutable state локальним;
    * документувати публічні модулі;
    * використовувати Dune;
    * керувати залежностями через opam;
    * не приховувати важливу логіку в надмірних PPX. '''Головна ніша:''' OCaml дуже природно підходить для мов, AST, компіляторів, аналізаторів і трансформацій коду. module type ORDERED = sig
    == Безпека OCaml-коду ==
    Array  mutable структура з доступом за індексом. OCaml
    
    '''Увага:''' polymorphic variants корисні в бібліотеках і гнучких API, але для звичайної доменної логіки часто достатньо звичайних variants. | [] -> acc
     | x :: rest -> loop (acc + x) rest
    OCaml має компактний синтаксис, орієнтований на вирази. * `let` bindings;
    * functions;
    * pattern matching;
    * immutable values за замовчуванням;
    * algebraic data types;
    * records;
    * modules;
    * signatures;
    * functors;
    * exceptions;
    * option і result types;
    * type inference. match direction with
    == Tuples ==
    
    == Exceptions ==
    Використання з `List.map`:
    type user = {
    
    <div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
    
    module type MATH_UTILS = sig
    {| class="wikitable"
    У цьому прикладі:
     | [] -> 0
     | _ :: rest -> 1 + length rest
    Функція з явною анотацією типів:
    
    </div>
    
     { alice with age = alice.age + 1 }
    </div>
     | Int of int
     | Add of expr * expr
     | Mul of expr * expr
    
    '''критично:''' для очікуваних помилок у доменній логіці часто краще використовувати Result, а exceptions залишати для справді виняткових ситуацій. PPX застосовується для для:
    
    * простих CRUD-застосунків без складної логіки;
    * AI/ML із потребою у найбільшій екосистемі;
    * frontend без спеціального стеку;
    * mobile development;
    * команд без готовності вивчати ML-підхід;
    * low-level systems без GC;
    * проєктів, де критично важлива велика кадрова база;
    * задач, де Python, Go, Java, TypeScript або Rust краще вписуються в інфраструктуру. '''Головне правило:''' хороший OCaml-код має використовувати типи як інструмент дизайну, а не лише як перевірку синтаксису. if b = 0 then Error "division by zero"
    '''Практична роль:''' `map`, `filter`, `fold` і подібні функції виступає як щоденними інструментами OCaml-розробника. Щоб оновити record, створюють нову копію зі зміненим полем. OCaml підтримує mutable state, але не робить його основою стилю. Основні конкурентні переваги OCaml:
    <syntaxhighlight lang="ocaml">
    
    Tuples корисні для:
    
    Обробка:
    
    </div>
    OCaml перевіряє, чи оброблено всі варіанти pattern matching. let status_label status =
    

|- | Типізація | Статична з type inference | Динамічна з optional type hints |- | Стиль | Functional, ML, ADT | Multi-paradigm, scripting |- | Продуктивність | Native compilation можлива | Залежить від runtime і бібліотек |- | ERP-платформа | Нішевіша | Дуже широка |- | Найкраще для | Correctness-heavy logic, compilers, formal tools | Automation, web, AI, data science, scripting |}

OCaml-системи можуть працювати з фінансовими, користувацькими, технічними або дослідницькими даними.