OCaml
'''Перевага:''' OCaml добре підходить для коду, де структура даних, варіанти станів і правила перетворення мають бути точними й перевірюваними.; Rust
Приклад:
'''Перевага:''' immutable records зменшують ризик випадкової зміни даних у різних частинах програми.; opam switch create 5.1.0
Dune застосовується для:
</syntaxhighlight>
Приклад:
Приклад:
- theorem provers;
- proof assistants;
- static analyzers;
- model checkers;
- symbolic execution tools;
- formal semantics;
- сертифікаційні інструменти;
- аналіз мов програмування.; Увага: polymorphic variants корисні в бібліотеках і гнучких API, але для звичайної доменної логіки часто достатньо звичайних variants.; Практична роль: OCaml добре підходить для інструментів, які працюють із формальними структурами, типами, логікою й деревами синтаксису.; }
; * сумування;
type direction = age = 25; let doubled =
Приклади модулів:
let older_alice =
Приклад:
exception Invalid_input of string
== Джерела ==
Core надає:
'''Pattern matching''' — одна з головних можливостей OCaml.; * Dune documentation.; Приклад:
end
# let add a b = a + b;;
== Tail recursion ==
let greet name = let counter = ref 0 object val square : int -> int Практична роль: стандартна бібліотека дає базові структури й функції, але в production-проєктах часто використовують додаткові бібліотеки.; {| class="wikitable" переважні аспекти OCaml</syntaxhighlight> </syntaxhighlight> Практична роль: opam надає можливість керувати версіями OCaml і залежностями проєкту.; OCaml є собою статично типізованою мовою.; let sum = x + y === AST і обчислення виразу ===
| [] -> 0
| x :: rest -> x + sum rest
'''Перевага синтаксису:''' OCaml надає можливість писати коротко, але зберігати сувору типову перевірку.; * `let` bindings;
* functions;
* pattern matching;
* immutable values за замовчуванням;
* algebraic data types;
* records;
* modules;
* signatures;
* functors;
* exceptions;
* option і result types;
* type inference.; Критерій
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
<syntaxhighlight lang="ocaml">
== Dune ==
</div>
age : int;
<syntaxhighlight lang="ocaml">
module type MATH_UTILS = sig
'''істотно:''' у OCaml-проєктах потрібно розуміти, чи застосовується стандартна бібліотека, Base/Core або інший набір бібліотек, бо API можуть відрізнятися.; Список є собою immutable і однозв’язним.;</div>
!; * `let` створює binding;
* `greet` — функція;
* `^` об’єднує рядки;
* `let () =` часто застосовується для коду з побічними ефектами;
* `print_endline` виводить рядок.; Menhir застосовується для:
Приклад:
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
== Menhir ==
Тепер `add_ten 5` поверне `15`.; * Menhir documentation.; * компіляції;
* запуску тестів;
* опису libraries;
* опису executables;
* інтеграції з opam;
* генерації документації;
* підтримки великих проєктів;
* watch mode;
* cross-package builds.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
| None
| Some of 'a
Виклик:
</syntaxhighlight> Практична роль: OCaml часто застосовується там, де мова програмування сама стає інструментом для аналізу інших мов, доказів або формальних моделей.; match xs with Приклад із функцією: let numbers = [|1; 2; 3|] end Приклади: List.map (fun x -> x * 2) numbers let status_label status = match xs with
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;">
<syntaxhighlight lang="ocaml">
<syntaxhighlight lang="ocaml">
</div>
| [] -> acc
| x :: rest -> loop (acc + x) rest
'''Висновок:''' Rust краще підходить для low-level systems, а OCaml — для виразного моделювання логіки, компіляторів і функціонального коду з GC.;== Multicore OCaml ==
Потрібно обережно працювати з: Головна ніша: OCaml дуже природно підходить для мов, AST, компіляторів, аналізаторів і трансформацій коду.; let age = 25 let rec length xs = додатково часто зустрічаються: |
Some name -> print_endline name | None -> print_endline "Not found"
References: |
;== OCaml і Python ==
let find_user id = Tuples корисні для: Практична порада: OCaml варто обирати, коли типи, ADT, pattern matching і модульність прямо допомагають зменшити складність проєкту.; ReasonML пов’язаний із: Функції вищого порядку дозволяють: let label s = let add a b = type 'a option = let add (a : int) (b : int) : int = Головна перевага: OCaml надає можливість точно описувати структури даних і стани системи так, щоб компілятор допомагав підтримувати коректність.;== Значення і let == let equal a b = Ord.compare a b = 0 |
;Обробка:
module Math_utils = struct
Функції в OCaml створюються через `let`.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
== Для чого застосовується OCaml ==
Приклад:
match status with
PPX застосовується для:
'''Option''' застосовується для значення, яке має змогу бути відсутнім.; age : int;
Modules використовуються для:
OCaml активно використовує функції вищого порядку.; компіляторів забезпечується через OCaml застосовується; додатково реалізовано статичного аналізу, формальних методів, фінансових систем, backend-сервісів, інструментів розробника, DSL, research software, верифікації, систем із високою вимогою до коректності й складної доменної логіки.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
Приклад:
Тип функції:
| Int of int
| Add of expr * expr
| Mul of expr * expr
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
match xs with
| Int n -> n
| Add (a, b) -> eval a + eval b
| Mul (a, b) -> eval a * eval b
print_endline (greet "Alice")
OCaml-функції зазвичай є собою curried.; fun x -> x * x
Використання:
'''Практична роль:''' UTop сприяє оперативно перевіряти ідеї й бачити inferred types.;<syntaxhighlight lang="ocaml">
'''Практична роль:''' records зручні для доменних об’єктів, конфігурацій, результатів і структурованих даних.;<syntaxhighlight lang="ocaml">
</div>
'''Правило:''' типобезпечний код усе одно має змогу випадково записати або передати чутливі інформаційні дані, якщо неправильно спроєктовані логи, API або конфігурація.;<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
== Синтаксис ==
'''Практична роль:''' `map`, `filter`, `fold` і подібні функції є собою щоденними інструментами OCaml-розробника.;<syntaxhighlight lang="ocaml">
OCaml і Haskell обидві є собою функціональними мовами, але мають різну філософію.;<syntaxhighlight lang="ocaml">
'''Головна перевага Option:''' відсутність значення стає явною частиною типу, а не прихованим null.; '''Висновок:''' Scala сильніша в JVM enterprise/backend, а OCaml — у ML-style функціональній розробці, модулях і мовних інструментах.;<syntaxhighlight lang="ocaml">
Приклад: |
Invalid_input message -> print_endline message
істотно: PPX має змогу зменшити boilerplate, але надмірне використання синтаксичних розширень ускладнює читання коду.;
let evens =
'''Dune''' — основна build system для сучасних OCaml-проєктів.; int -> int -> int
<syntaxhighlight lang="ocaml">
if b = 0 then Error "division by zero"
name : string;
'''UTop''' — зручний interactive toplevel для OCaml.;</div>
}
val add : int -> int -> int = <fun>
</div>
</div>
let active = true
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
let divide a b =
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
</div>
Core — альтернативна стандартна бібліотека від Jane Street.; Menhir — parser generator для OCaml.;== Парсери і компілятори == </syntaxhighlight> OCaml і F# мають спільну ML-спадщину.; * розширені модулі;
== Higher-order functions ==
== Перша програма на OCaml ==
match n with
<syntaxhighlight lang="ocaml">
компонент із signature:
} [@@deriving show]
age : int;
module Math_utils : MATH_UTILS = struct
</div>
Підказка: в OCaml-прикладах істотно дивитися на типи, variants, pattern matching і те, чи всі можливі стани оброблені.;== Типові помилки початківців == ReasonML — альтернативний синтаксис для OCaml, який був створений, щоб зробити OCaml-підхід ближчим до JavaScript/React-розробників.; { alice with age = alice.age + 1 } Результат — `10`.; Такі системи часто потребують: Практична роль: рекурсія природно поєднується зі списками, trees, AST і pattern matching.; Критерій a + b Record — це тип із іменованими полями.; Arrays корисні для: </syntaxhighlight> Result</syntaxhighlight> Coq і OCamlJane Street CoreOCaml і Haskelllet add_ten = `fold` згортає список в одне значення.; Потрібно контролювати:
`rec` потрібен для рекурсивної функції.; Це означає, що багато помилок типів знаходяться під час компіляції.;
Практична порада: для великих списків варто писати tail-recursive функції, щоб уникнути переповнення стеку.; type counter = { a + b </syntaxhighlight> </syntaxhighlight> type user = {
</syntaxhighlight>
let numbers = [1; 2; 3; 4; 5] </syntaxhighlight> numbers.(0) <- 10 </syntaxhighlight> end
Приклад: let () = counter := !counter + 1 OCaml і Scala
|
;== opam ==
Formal methodsПриклад:
match direction with match status with
</syntaxhighlight> </div>
* паралельного виконання;
* concurrent programming;
* масштабування на кілька ядер;
* high-performance services;
* нових runtime-можливостей;
* structured concurrency;
* effect handlers.;<syntaxhighlight lang="bash">
OCaml часто зустрічається поруч із формальними методами й verification tools.; Приклад:
active : bool;
<syntaxhighlight lang="ocaml">
| `Ok -> "ok"
| `Error message -> "error: " ^ message
<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">
== Functors ==
!; Щоб “оновити” record, створюють нову копію зі зміненим полем.;
UTop</syntaxhighlight> Tuples active = true;
* 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;
* систем зі складною бізнес-логікою.; '''істотно:''' OCaml не надає можливість багатьом неочевидним runtime-помилкам дійти до виконання програми.;</div>
'''Практична роль:''' Dune є собою стандартним інструментом збірки для більшості сучасних OCaml-проєктів.;
type item = Ord.t Optiontype expr = type t |
;== ReasonML ==
end } Polymorphic variants гнучкіші за звичайні variants, але можуть ускладнювати типи.;
List.filter (fun x -> x mod 2 = 0) numbers Причини: |
; Variants — це варіанти ADT.;</syntaxhighlight>
module type ORDERED = sig Array — mutable структура з доступом за індексом.; * OCaml Manual.;ReScript має власний синтаксис і екосистему, але історично пов’язаний з OCaml-ідеями.; let turn_back direction = Висновок: Python швидший для старту й має ширшу екосистему, а OCaml дає сильніші compile-time гарантії для складної логіки.; у поєднанні виразності, суворої типізації, компактного синтаксису й потужної модульної системи виступає ключовою рисою OCaml є собою практичною функціональною мовою, яка підтримує роботу додатково імперативний і об’єктний стиль.; let value = parse "" in Type inferenceПрактична роль: ReScript є собою окремішим напрямом для typed JavaScript/frontend, але має корені в OCaml-екосистемі.; Приклад: let divide a b = Функції</syntaxhighlight> Обробка: let add a b = | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Основна ніша | 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 контроль | Обмеженіший | Сильний |
Значення в OCaml за замовчуванням immutable.; * моделювати домен через ADT;
- використовувати pattern matching;
- не ігнорувати compiler warnings;
- вмикати суворіші warnings у важливих проєктах;
- використовувати Option замість null-подібних домовленостей;
- використовувати Result для очікуваних помилок;
- робити records зрозумілими;
- розділяти modules і signatures;
- не ускладнювати functors без потреби;
- писати тести;
- тримати mutable state локальним;
- документувати публічні модулі;
- використовувати Dune;
- керувати залежностями через opam;
- не приховувати важливу логіку в надмірних PPX.; name = "Alice";
!; Її головна сила.; * opam documentation.; Haskell
let add a b = a + b
- передавати поведінку як аргумент;
- комбінувати перетворення;
- уникати дублювання;
- писати декларативний код;
- будувати pipelines.;
</syntaxhighlight>
print_endline value
!;== Exhaustiveness checking ==
let describe_number n =
Особливості синтаксису:
Практична роль: анонімні функції зручні для короткої логіки, яку передають у функції вищого порядку.; PPX — платформа синтаксичних розширень OCaml.; !;Статична типізація
val compare : t -> t -> int
Практична роль: Result надає можливість моделювати помилки без exceptions і змушує явно їх обробляти.; * Документація Lwt і Async.;== Приватність даних ==
Records
Коли OCaml має змогу бути невдалим вибором
| New | Active | Blocked | Closed
</div>
| New -> "new"
| Active -> "active"
</syntaxhighlight>
Рекурсія часто застосовується в OCaml замість класичних циклів.;
{ user with active = true }
Pattern matching:
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
'''Algebraic data types''' або '''ADT''' дозволяють описувати типи як набір варіантів.;<syntaxhighlight lang="ocaml">
Тут `Failed` містить додаткове значення — причину помилки.; Основні переважні аспекти OCaml:
OCaml застосовується в частині фінансової індустрії.; List.fold_left (fun acc x -> acc + x) 0 [1; 2; 3; 4] Functors використовуються для:
Mutability
dune test
- algebraic data types добре описують AST;
- pattern matching зручний для обходу дерев;
- strong typing зменшує помилки;
- modules допомагають структурувати phases;
- recursion природна для tree processing;
- type inference зручна для складних алгоритмів.; Поширені варіанти:
Анонімна функція створюється через `fun`.;<syntaxhighlight lang="ocaml">
'''істотно:''' у фінансовому коді типи можуть допомагати не змішувати різні сутності: валюти, інструменти, стани ордерів, результати валідації й помилки.; let square x = x * x
'''істотно:''' mutable state у OCaml доступний, але його краще локалізувати й використовувати там, де він справді потрібен.;
- сильній статичній типізації;
- type inference;
- pattern matching;
- algebraic data types;
- модульній системі;
- native compiler;
- використанню в research і compiler tooling;
- застосуванню в промислових фінансових системах;
- зв’язку з формальними методами й theorem proving.; * експериментів;
- навчання;
- перевірки функцій;
- дослідження типів;
- інтерактивної роботи з бібліотеками;
- REPL-driven development.;{{SEO