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

OCaml

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

'''Перевага:''' 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 добре підходить для інструментів, які працюють із формальними структурами, типами, логікою й деревами синтаксису.; }
Перевага currying: можна без зайвих зусиль створювати спеціалізовані функції через часткове сфера застосування аргументів.;
; * сумування;
  • агрегації;
  • побудови maps;
  • обробки подій;
  • перетворення AST;
  • накопичення результатів.; * Real World OCaml.; Її сила розкривається тоді, коли типи, ADT і pattern matching стають частиною дизайну системи.;

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-спадщину.; * розширені модулі;

  • зручні API;
  • більш послідовний стиль;
  • додаткові типи;
  • функції для production;
  • utilities для великих codebase.;
== 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 і OCaml

Jane Street Core

OCaml і Haskell

let add_ten =

`fold` згортає список в одне значення.; Потрібно контролювати:
`rec` потрібен для рекурсивної функції.; Це означає, що багато помилок типів знаходяться під час компіляції.;
Головна думка: OCaml — це мова для точного моделювання даних і станів.;

Практична порада: для великих списків варто писати tail-recursive функції, щоб уникнути переповнення стеку.; type counter = {

a + b

</syntaxhighlight>

</syntaxhighlight>

type user = {

  • написання компіляторів;
  • створення інтерпретаторів;
  • статичний аналіз коду;
  • формальна верифікація;
  • фінансові системи;
  • trading systems;
  • DSL;
  • backend-сервіси;
  • парсери;
  • type checkers;
  • proof assistants;
  • аналіз протоколів;
  • data transformation;
  • складна доменна логіка;
  • research tools.; * Документація Jane Street Base/Core.; Приклад:

</syntaxhighlight>

  • коротких груп значень;
  • координат;
  • проміжних результатів;
  • пар;
  • простих return values.; let rec eval expr =

let numbers = [1; 2; 3; 4; 5] </syntaxhighlight>

numbers.(0) <- 10 </syntaxhighlight>

end

; let numbers = [1; 2; 3]
else Ok (a / b)

OCaml має об’єктну систему, хоча багато OCaml-коду пишеться без класичного OOP.; * performance-sensitive code;

  • mutable buffers;
  • numeric algorithms;
  • indexing;
  • low-level data;
  • взаємодії з бібліотеками.; Доступ до поля:

let point = (10, 20)

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

</syntaxhighlight> opam install core

Pending Paid Failed of string Refunded

Функція з явною анотацією типів:

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

</syntaxhighlight>

active : bool;

type status =

'''Сильна сторона OCaml:''' functors дають потужну модульну абстракцію, яку складно прямо повторити в багатьох інших мовах.; Назва повязана з Objective Caml  розвитком Caml із підтримкою обєктної системи та практичних інструментів для розробки.; '''Суть OCaml:''' pattern matching надає можливість явно описувати обробку різних форм даних.; * compiler development;
* interpreters;
* static analysis;
* formal methods;
* DSL;
* фінансової логіки;
* складних state machines;
* backend-сервісів із високою вимогою до коректності;
* tools для розробників;
* parsers;
* type checkers;
* symbolic computation;
* proof-related tooling;
* систем, де істотно моделювати всі стани через типи.; '''Основна ідея:''' OCaml надає можливість описувати складну логіку через типи, pattern matching і функції так, щоб багато помилок знаходилися ще до запуску програми.; class counter =

'''Критично:''' сильна типізація не замінює threat modeling, security review, тестування й контроль залежностей.; * Матеріали щодо ML-сімейства мов, type inference, algebraic data types, modules, functors, compiler development і formal methods.; let describe_list xs =
'''Практична роль:''' signatures дозволяють точно описати, що компонент відкриває назовні, і приховати зайві деталі реалізації.; Python
let numbers = [1; 2; 3; 4; 5]
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

Приклад:

end

У цьому прикладі:

Ok of 'a Error of 'e

</syntaxhighlight>

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

Хороші практики OCaml

let square =

  • deriving functions;
  • serialization;
  • тестів;
  • code generation;
  • annotations;
  • boilerplate reduction;
  • library-specific syntax.;=== Безпечне ділення через Result ===
; Практична порада: якщо значення має багато полів або важливі назви полів, краще використовувати record, а не tuple.; Приклад команди: Практична роль: immutable values допомагають писати передбачуваніший код без випадкових змін стану.;
  • network services;
  • concurrent I/O;
  • servers;
  • clients;
  • background tasks;
  • event loops;
  • non-blocking operations.; * групування функцій;
  • namespace;
  • приховування реалізації;
  • API boundaries;
  • великих codebase;
  • reusable components;
  • generic programming через functors.;</syntaxhighlight>
Практична роль: OCaml особливо сильний там, де істотно явно змоделювати всі можливі стани й не забути жоден варіант під час обробки.;
OCaml підтримує роботу exceptions.; OCaml і Rust мають різні ніші, але обидві приділяють велику увагу типам.;
 mutable value : int;

== Коли варто використовувати OCaml ==
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
`fold` корисний для:
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
|-
| Платформа
| Native/bytecode OCaml
| JVM
|-
| Типізація
| Статична, type inference
| Статична, потужна type system
|-
| Стиль
| ML, modules, ADT
| FP + OOP, traits, JVM ecosystem
|-
| програмний пакет
| Менша, нішевіша
| Ширша JVM-екосистема
|-
| Основні ніші
| Tools, compilers, formal methods
| Backend, data, enterprise JVM
|}

<syntaxhighlight lang="ocaml">
module Make_set (Ord : ORDERED) = struct
'''Висновок:''' Haskell сильніший у чистому FP і type-level abstraction, а OCaml часто сприймають як більш прагматичну ML-мову.; OCaml став відомим завдяки наявності:
Tuple групує кілька значень без іменованих полів.;</div>
 loop 0 xs

Компілятор розуміє, що `add` функціонує з цілими числами, бо використано оператор `+`.;== Arrays ==

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

Приклад:

let () = counter := !counter + 1

OCaml і Scala

  • сильна статична типізація;
  • type inference;
  • algebraic data types;
  • pattern matching;
  • exhaustiveness checking;
  • modules;
  • signatures;
  • functors;
  • native compilation;
  • immutable data за замовчуванням;
  • компактний синтаксис;
  • хороша придатність для компіляторів;
  • зручність для формальних інструментів;
  • Option і Result для безпечнішого моделювання;
  • продуктивний функціональний стиль.; F#
;== opam ==

Formal methods

Приклад:

  • створення парсерів;
  • компіляторів;
  • DSL;
  • мовних інструментів;
  • статичного аналізу;
  • складних граматик.; OCaml — це функціональна мова програмування ML-сімейства, яка поєднує сильну статичну типізацію, type inference, algebraic data types, pattern matching, modules, signatures, functors і native compilation.;
match direction with
match status with
  • Офіційна документація OCaml.;== Приклади задач на OCaml ==

</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, створюють нову копію зі зміненим полем.;
  • OCaml type system;
  • JavaScript ecosystem;
  • BuckleScript / ReScript історією;
  • React-подібним frontend;
  • альтернативним синтаксисом.;== Algebraic data types ==

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

Option

type expr =

type t
;== ReasonML ==

end }

Polymorphic variants гнучкіші за звичайні variants, але можуть ускладнювати типи.;
  • Base;
  • Core;
  • Core_kernel;
  • Async.; let squares = List.map (fun x -> x * x) numbers
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


</syntaxhighlight>

let activate user =

Загальний характеристика

let x = 10 + "text"

</div>
== Див.; додатково ==

'''істотно:''' для очікуваних помилок у доменній логіці часто краще використовувати Result, а exceptions залишати для справді виняткових ситуацій.; OCaml
'''Головна перевага:''' OCaml дає переважні аспекти статичної типізації без потреби постійно писати типи вручну.; * боротися з type errors замість розуміння моделі типів;
* забувати, що `=`  structural equality, а `==`  physical equality;
* плутати lists і arrays;
* використовувати exceptions там, де краще Result;
* не обробляти всі variants;
* створювати занадто загальні string/int коди замість ADT;
* зловживати mutable state;
* не розуміти currying;
* неправильно застосовувати часткове сфера застосування;
* ускладнювати модулі й functors на ранньому етапі;
* ігнорувати warnings;
* не використовувати Dune/opam стандартним способом.; OCaml

істотно: OCaml сильний у складній логіці й типобезпечному моделюванні, але не завжди є собою найпрагматичнішим вибором для масових web або data science задач.;</syntaxhighlight> Такий код не пройде типову перевірку, бо не можна додавати число й рядок.;== Анонімні функції == OCaml має бібліотеки для асинхронного програмування.; * встановлення компілятора;

  • керування пакетами;
  • створення switches;
  • ізоляції середовищ;
  • встановлення бібліотек;
  • dependency resolution;
  • інтеграції з Dune.; | Int n -> n
| Add (a, b) -> eval a + eval b
| Mul (a, b) -> eval a * eval b

Async і Lwt

if id = 1 then Some "Alice" else None

Головна сила ADT: можна описати доменні стани точно, без неявних рядків, числових кодів або nullable-полів.; let y = 20

`let` створює binding.; try

 let square x = x * x
== Тематичні мітки ==
OCaml застосовується для:

Він застосовується для:

* generic modules;
* reusable data structures;
* dependency injection на рівні модулів;
* type-safe abstractions;
* parametrized libraries.;

opam застосовується для:

'''Functor'''  це компонент, який приймає інший компонент як аргумент і повертає новий компонент.; let name = alice.name
</div>
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">

'''Signature''' описує інтерфейс модуля.; let result = Math_utils.add 2 3

<syntaxhighlight lang="ocaml">

'''Суть прикладу:''' OCaml-код часто складається з маленьких функцій, які приймають значення й повертають нові значення.; Це означає, що функція з кількома аргументами фактично приймає один аргумент і повертає нову функцію.; Рекомендовано:
Вони використовуються для:
'''Увага:''' OCaml підтримує роботу OOP, але центральний стиль мови зазвичай функціональний і модульний.; a + b
let total =
</div>
 a + b
== Standard library ==

<syntaxhighlight lang="ocaml">
 match expr with

OCaml має обмеження.;</div>

 "Hello, " ^ name

* менша популярність, ніж у Python, Java, JavaScript або Rust;
* менша кількість розробників;
* менша програмний пакет для web і AI;
* незвичний синтаксис для OOP/imperative-розробників;
* складна компонентна платформа для новачків;
* functors можуть бути важкими для старту;
* кілька стандартних бібліотечних стилів;
* tooling менш масове, ніж у великих mainstream мовах;
* GC має змогу бути небажаним у деяких low-level системах;
* onboarding команди потребує часу.;<syntaxhighlight lang="ocaml">
 if value = "" then raise (Invalid_input "empty input")
let () = c.value <- c.value + 1
'''Result''' застосовується для операцій, які можуть завершитися успіхом або помилкою.; Критерій
| Ok value -> Printf.printf "Result: %d\n" value
| Error message -> Printf.printf "Error: %s\n" message
</div>
<syntaxhighlight lang="ocaml">

OCaml має компактний синтаксис, орієнтований на вирази.; OCaml додатково має polymorphic variants.; val mutable value = 0
 match s with
</div>

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

Приклад:

'''Практична роль:''' variants зручні для статусів, команд, станів протоколу, AST, подій і результатів операцій.; let rec sum xs =
<syntaxhighlight lang="ocaml">
 | New
 | Active
 | Blocked
 | Closed

 match xs with
</div>
 | New -> "New"
 | Active -> "Active"
 | Blocked -> "Blocked"
 | Closed -> "Closed"
=== Обробка статусу ===

'''Увага:''' arrays у OCaml mutable, з цієї причини їх потрібно використовувати свідомо й не змішувати з immutable data без потреби.; OCaml

Обробка:

Використання з `List.map`:

name : string;

Приклад:

Суть fold: це універсальний спосіб пройти колекцію й накопичити результат.; істотно: OCaml — не лише академічна мова.; Компілятор попередить, що не оброблено `Blocked` і `Closed`.;

type status =

dune exec ./main.exe

Приклад:

let (x, y) = point

  • сильна типізація;
  • компактність;
  • коректність складної логіки;
  • швидкий native code;
  • контроль помилок;
  • зручність моделювання варіантів стану;
  • good tooling для великих codebase;
  • супровід production libraries у певних екосистемах.; Scala

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

Exceptions

let name = "Alice"

  • точного моделювання термів;
  • pattern matching;
  • рекурсивної обробки дерев;
  • сильної типізації;
  • модульності;
  • надійного compiler/runtime.; Це означає, що binding не змінюється після створення.;

Variants

Обробка:

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

name : string;
| North
| South
| East
| West

Причини:

 | North -> South
 | South -> North
 | East -> West
 | West -> East
 else Ok (a / b)

== Currying ==
'''Історична роль:''' ReasonML показав, що типова платформа й функціональний стиль OCaml можуть використовуватися в frontend і JavaScript-контексті.; OCaml
type user = {

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

  • `Array`;
  • `String`;
  • `Map`;
  • `Set`;
  • `Hashtbl`;
  • `Option`;
  • `Result`;
  • `Seq`;
  • `Printf`;
  • `Sys`;
  • `Unix`.; OCaml походить із ML-сімейства мов програмування.;

</syntaxhighlight>

Lists

Signatures

  • `Async`;
  • `Lwt`.; !;== історичний розвиток OCaml ==

OCaml і Rust

dune build

let rec loop acc xs =

Увага: multicore OCaml — важливий сучасний напрям, але конкретні підходи в проєкті залежать від версії компілятора й бібліотек.; {| class="wikitable"

Обмеження OCaml

let parse value =

Сучасний OCaml має еволюція у напрямі multicore і effects.; Практична роль: Async і Lwt дозволяють будувати асинхронні сервіси й I/O-heavy застосунки в OCaml.; OCaml підтримує роботу mutable state, але не робить його основою стилю.;

with

'''Module''' — ключовий інструмент організації OCaml-коду.; else value
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<syntaxhighlight lang="ocaml">

`_` означає будь-яке інше значення.; let result = add 2 3

Pattern matching по списку:

Висновок

</syntaxhighlight>

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

Безпека OCaml-коду

OCaml дуже часто використовують для парсерів, компіляторів і мовних інструментів.;== PPX == let () =

OCaml історично пов’язаний із частиною екосистеми theorem proving, зокрема з інструментами, які використовують ML-підхід.;== Recursion == Приклад:

type payment_status =

<syntaxhighlight lang="ocaml">

Приклад:

'''Небезпека:''' якщо в OCaml моделювати домен лише рядками й числами, втрачається значна частина переваг мови.; Вона особливо сильна в задачах, де потрібно точно моделювати складні стани, писати компілятори, аналізатори, формальні інструменти, фінансову логіку або надійні backend-компоненти.;=== Record користувача ===

Приклад:

завдяки наявності '''істотно:''' exhaustiveness checking користувачі можуть не забути нові або рідкісні стани системи.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

</div>
</div>
'''Суть list:''' списки добре підходять для рекурсивної обробки, але не є собою найкращим вибором для частого доступу за індексом.;== Fold ==

</div>

}
'''ReScript''' виник із BuckleScript/ReasonML-напряму й орієнтований на typed frontend development, який компілюється в JavaScript.; OCaml має змогу бути не найкращим вибором для:

List  одна з базових структур OCaml.; Простий приклад:
Приклад AST:
 | [] -> 0
 | _ :: rest -> 1 + length rest
OCaml перевіряє, чи оброблено всі варіанти pattern matching.; Вона застосовують, коли потрібно і в production-системах, особливо там, де важлива коректність складної логіки.;<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
match divide 10 2 with

let add a b =

</div>

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

<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
 let add a b = a + b
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
 | 0 -> "zero"
 | 1 -> "one"
 | _ -> "many"
Приклад ідеї:

</div>

'''opam'''  package manager для OCaml.;== актуалізація records ==
</div>

OCaml має стандартну бібліотеку з базовими модулями.; Приклад:

Приклад:

</syntaxhighlight>

Тип:

  • логами;
  • telemetry;
  • serialized data;
  • database records;
  • API payloads;
  • secrets;
  • tokens;
  • config files;
  • test fixtures;
  • crash reports;
  • debug output;
  • financial data.;== Polymorphic variants ==

match find_user 1 with </syntaxhighlight>

Int of int Add of expr * expr Mul of expr * expr

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

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

OCaml добре підходить для:

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

Pattern matching

match expr with

Mutable record field:

Modules

</div>
Об’єкти в OCaml можуть бути корисними для:
|-
| Обчислення
| Strict за замовчуванням
| Lazy за замовчуванням
|-
| Типізація
| Статична, type inference
| Статична, дуже потужна type system
|-
| Практичність
| Часто більш прагматичний стиль
| Більш чистий функціональний стиль
|-
| Effects
| Доступні напряму
| Контролюються через type system і abstractions
|-
| Основні асоціації
| Compilers, tools, finance, formal methods
| Research, FP, compilers, type-level programming
|}

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
 if b = 0 then Error "division by zero"
'''Type inference''' означає, що компілятор часто сам виводить типи без явного зазначення.; Критерій

<syntaxhighlight lang="ocaml">

* input validation;
* помилки бізнес-логіки;
* unsafe features;
* FFI з C;
* serialization;
* dependency risks;
* secrets;
* logging sensitive data;
* network input;
* parser vulnerabilities;
* authorization;
* concurrency bugs;
* configuration errors.; '''Головна роль modules:''' вони дозволяють структурувати код і явно відокремлювати інтерфейс від реалізації.; value <- value + 1

 method value =
 value
 end

type expr =

let rec eval expr = Це істотно для:

add 10

Тип:

Помилка: обирати OCaml лише через “функціональність”, не враховуючи командний досвід, екосистему й вимоги deployment.; let sum xs =

<syntaxhighlight lang="ocaml">

let x = 10

opam install dune

| [] -> "empty"
| _ :: _ -> "not empty"
Records immutable за замовчуванням.;

type user = {

let status_label status = Приклад ідеї: <syntaxhighlight lang="ocaml">

let alice = {

Головне правило: хороший OCaml-код має використовувати типи як інструмент дизайну, а не лише як перевірку синтаксису.;<syntaxhighlight lang="ocaml">

let c = { value = 0 } Оригінальний `alice` не змінюється.; Поширені помилки:

type ('a, 'e) result =

Можливі проблеми: <syntaxhighlight lang="ocaml"> Tail recursion надає можливість компілятору оптимізувати рекурсивні виклики.; print_endline "Hello, world!"

Висновок: F# переносить ML-ідеї у .NET-світ, а OCaml має власну екосистему й сильну роль у компіляторах, формальних інструментах і native tooling.; OCaml — це функціональна мова програмування з родини ML, яка поєднує сильну статичну типізацію, type inference, pattern matching, algebraic data types, модулі, functors, immutable data і можливість компіляції у швидкий native code.; Приклад помилки: Обробка: Приклад:

OCaml і F#

val add : int -> int -> int
  • простих CRUD-застосунків без складної логіки;
  • AI/ML із потребою у найбільшій екосистемі;
  • frontend без спеціального стеку;
  • mobile development;
  • команд без готовності вивчати ML-підхід;
  • low-level systems без GC;
  • проєктів, де критично важлива велика кадрова база;
  • задач, де Python, Go, Java, TypeScript або Rust краще вписуються в інфраструктуру.;
in

ReScript