Приклад:
Це небезпечний інструмент.; Either корисний для validation, parsing, API responses і business rules.;== Hedgehog ==
- для однакових inputs завжди повертає однаковий output;
- не змінює зовнішній стан;
- не має прихованих side effects.; Ця функція чиста: вона лише обчислює суму.; Guards дозволяють писати умовну логіку.;
це чиста функціональна мова програмування зі статичною типізацією, lazy evaluation, immutable data, algebraic data types, pattern matching, type classes і сильним акцентом на математичну коректність програм виступає ключовою рисою
Haskell.; Python частіше обирають для ML і automation.; Rust і Haskell різні, але обидві мови цінують correctness.;
можна замінити на:
'''Maybe''' — тип для значення, яке має змогу бути відсутнім.; statusText Paid = "Оплачено"
'''Hedgehog''' — інша property-based testing library.; Різні версії compiler і dependencies можуть суттєво впливати на build.; -- Just 5
statusText :: OrderStatus -> String
<pre>
Ключова ідея: результат одного кроку впливає на наступний крок.; з цієї причини можна частково застосовувати функції:
deriving (Eq, Show)
== Головна ідея ==
Приклади:
Haskell сприяє писати безпечніший код завдяки наявності:
* читати поля;
* оновлювати поля;
* компонувати доступ;
* працювати з immutable data.; Недолік: type-level підхід має learning curve.; Приклад:
<pre>
[[Категорія:Backend]]
GADTs дозволяють точніше виражати типи конструкторів.; Rust частіше обирають для системного production-коду.; Haskell documentation page містить Cabal User Guide серед основних довідників Haskell tooling.; GHC є собою фактичним стандартом для сучасного Haskell.; }
Через GHCup можна встановлювати:
DSL можуть бути корисні для business rules, finance, configuration, hardware description, compilers і formal models.;== Type classes ==
Офіційна сторінка Haskell описує мову як purely functional programming language із referential transparency, immutability і lazy evaluation.; pure (+) <*> Just 2 <*> Just 3
Haskell часто порівнюють із іншими функціональними мовами.; Особливість
У Haskell іноді потрібно явно керувати strictness, щоб уникнути:
У Haskell є собою кілька formatters:
cabal test
data Customer = Customer
Поєднання має змогу бути сильним, але потребує careful boundary design.;== Concurrency і parallelism ==
* системних бібліотек;
* performance-critical code;
* legacy C libraries;
* OS APIs;
* hardware integrations.; Це означає:
Haskell має змогу бути продуктивним, але performance requires understanding.; Це схоже на креслення перед будівництвом, а не ремонт під час руху.;== Language extensions ==
Haskell — для складної логіки, компіляторів, DSL і functional architecture.; * type-safe queries;
* raw SQL;
* migrations;
* PostgreSQL;
* lightweight access;
* compile-time checks.; Для production performance потрібно використовувати profiling, а не здогадки.;
Він має фокус на type safety і productive web development.;
= Draft
Haskell Language Server
GHCup — рекомендований installer і manager для Haskell toolchain.; * persistent;
- beam;
- esqueleto;
- opaleye;
- postgresql-simple;
- sqlite-simple;
- hasql.; *
Right Int — успішний результат;
Left String — помилка.; toLower
{ customerId :: Int
stack run
| PaymentDeclined String
| PaymentError String
Приклад:
<pre>
numbers = [1,2,3,4]
<pre>
Cabal застосовується для:
Functor надає можливість працювати з “значенням у контексті”, не витягуючи його вручну.;[2]
Чиста функція — функція, яка:
Referential transparency означає, що expression можна замінити його значенням без зміни поведінки програми.; * ormolu;
- fourmolu;
- stylish-haskell;
- hindent historically.; normalizeName = trim .; Для цього використовують:
Корисний для конкретних examples:
HLint корисний, але не кожну пораду потрібно приймати автономно.; Guards часто роблять код чистішим, ніж nested if.; Перед використанням package варто перевіряти maintenance, compatibility, license і recent releases.; Це binding імені
x до значення
10.;
, customerEmail :: Maybe Text
- опису packages;
- builds;
- dependencies;
- tests;
- benchmarks;
- library/executable targets;
- Hackage packages.; add10 5
Базові type classes:
- GHC;
- cabal-install;
- Stack;
- Haskell Language Server.; * змінні перезаписуються;
- об’єкти мутують;
- функції можуть змінювати глобальні інформаційні дані;
- side effects приховані;
- порядок виконання дуже важливий.;== Haskell у бізнесі ==
Документація Stack описує, що Stack керує GHC installations і автономно вибирає потрібну версію GHC для проєкту.; Але FFI вносить ризики memory safety, ABI mismatch і runtime crashes.;[3]
У великих проєктах можуть використовуватися extensions і libraries для кращої роботи з records.;== Testing ==
Space leak — ситуація, коли програма утримує пам’ять довше, ніж потрібно.; unsafePerformIO надає можливість виконати IO в pure-looking context.; Приклад:
У Haskell це функціонує: нескінченний список [1..] не обчислюється в цілому.; * pure functional design;
- algebraic modeling;
- type-level programming;
- parsers;
- DSL;
- correctness через типи.;
== FFI ==
Але lens ecosystem має learning curve.; У контексті [[K2 ERP]] Haskell має змогу бути корисним опосередковано:
Але надмірний type-level code має змогу бути важким для команди.;
Prelude> map (*2) [1,2,3]
GADT — Generalized Algebraic Data Type.; * значення immutable;
- функції не змінюють світ без явного типу;
- типи описують можливі стани;
- багато помилок ловить компілятор;
- програма будується через композицію функцій.; Yesod — web framework для Haskell.; як ілюстрація:
tail numbers
= PaymentOk
'''Functor''' — type class для контейнерів або контекстів, над якими можна застосувати функцію.; * навчання;
* швидкої перевірки functions;
* type exploration;
* debugging;
* prototyping;
* REPL workflow.; Це корисно для:
</div>
-- 15
<pre>
== Type inference ==
== Database access ==
<pre>
У звичайному імперативному стилі програма часто змінює стан:
Вибір залежить від того, чи потрібні:
Добра практика — використовувати extensions усвідомлено й документувати, навіщо вони потрібні.; Через lazy evaluation Haskell має змогу створювати thunks замість негайного обчислення значень.; '''Servant''' — type-level web API framework.; Мова !!;== Template Haskell ==
GHC охоплює:
Типові команди:
== do notation ==
'''Stack''' — альтернативний build tool для Haskell.;== Haskell і безпека ==
== Hackage ==
Product type містить кілька полів.; class Printable a where
'''Hackage''' — центральний repository Haskell packages.;<pre>
Aeson надає можливість encoding/decoding JSON.; 5
Hackage корисний для:
</div>
Поширені типи:
* time;
* memory;
* allocations;
* cost centers;
* heap usage;
* thunks;
* space leaks.;== Lazy evaluation ==
data PaymentResult
List — базова структура даних.; Приклади:
Parser combinators дозволяють будувати parser із маленьких parser functions.;
Це схоже на імперативний код, але типи все одно контролюють effects.; add a b = a + b
filter even numbers
Extensions дають силу, але можуть ускладнювати код.; Приклади:
STM
main :: IO ()
Cabal
GHC
Algebraic Data Types або ADT — один із найсильніших інструментів Haskell.; * parsec;
- megaparsec;
- attoparsec.; * laziness;
- strictness;
- data structures;
- allocation;
- garbage collection;
- fusion;
- compiler optimization;
- profiling;
- strict Text/ByteString;
- unboxed types;
- streaming libraries.;.; Приклад:
cabal run
як ілюстрація, замість перевірки:
Haskell має сильну культуру testing.;[4]
Haskell сильніший у:
STM — одна з сильних сторін Haskell для складної concurrency.;== Eq, Ord, Show, Read ==
!; Haskell має різні підходи до баз даних:
- DSL;
- config languages;
- compilers;
- data formats;
- protocol parsing.; * strict fields;
- bang patterns;
- foldl';
- profiling;
- правильні data structures;
- streaming замість накопичення всього списку.;
застосовується в деяких libraries для:
GHCi корисний для:
Приклад:
'''DSL''' — Domain-Specific Language.; У Haskell documentation page передбачено Haddock User Guide серед основних tooling guides.;<div style="background:#eef6ff;border-left:6px solid #2f80ed;padding:14px 18px;margin:16px 0;border-radius:8px;">
'''GHCi''' — інтерактивне середовище Haskell.; Це корисно для laziness, але якщо thunks накопичуються, має змогу зрости використання пам’яті.; * Yesod;
* Servant;
* Scotty;
* Spock;
* Warp;
* WAI;
* IHP.; | Paid
| Cancelled
Приклад:
add 2 3
Можна аналізувати:
Exceptions частіше використовуються в IO, resource handling і runtime errors.; QuickCheck — library для property-based testing.; Це не змінна у звичному імперативному сенсі.; cabal update
filter even [1..10]
Immutability сприяє:
map (*2) numbers
findCustomer customerId >>= findPrimaryEmail
Приклад:
* compiler;
* runtime system;
* GHCi;
* optimizer;
* extensions;
* profiling support;
* documentation;
* libraries;
* package support.;== Strictness ==
sumList [] = 0
Форматування важливе, бо Haskell чутливий до indentation.; Вони дозволяють:
cabal build
== HUnit ==
Python простіший для швидких scripts, data science і AI ecosystem.;<ref>https://www.haskell.org/downloads/</ref>
* types;
* pure functions;
* correctness;
* compilers;
* DSL;
* property-based testing;
* domain modeling.; '''Template Haskell''' — meta-programming mechanism.; C/C++ корисні для низькорівневих libraries.; '''Thunk''' — відкладене обчислення.;== Type-level programming ==
Перевага Haskell у бізнесі — типи й коректність.; Haskell дуже сильний у parsers.; Приклад:
Можна написати:
[[Категорія:Compiler]]
* пошуку libraries;
* перегляду package documentation;
* version history;
* dependencies;
* maintainers;
* source tarballs.; У production-коді часто використовують готові functions на кшталт <code>sum</code>, <code>map</code>, <code>fold</code>.;
Приклад:
== Recursion ==
'''Cabal''' — build system і package description format для Haskell.; Haskell не є собою ERP-системою.; * type-safe orchestration;
* domain modeling;
* parsers;
* DSL;
* high-level logic.; Це можна читати як:
printValue :: a -> String
reverse (reverse xs) == xs
== Haddock ==
| amount > 10000 = 20
| amount > 5000 = 10
| otherwise = 0
== Актуальний стан інструментів ==
sort [3,1,2] == [1,2,3]
можна перевірити властивості:
- результат відсортований;
- довжина не змінилась;
- усі елементи збережені;
- повторне сортування не змінює результат.
Це добре підходить для алгоритмів, financial rules, parsers і transformations.
Haskell і API
Haskell може створювати type-safe API.
Особливо з Servant можна описати API на рівні типів.
Це дозволяє:
- генерувати server;
- генерувати client;
- зменшити mismatch між route і handler;
- мати compile-time checks;
- документувати API через тип.
Але команда має розуміти type-level programming.
Коли Haskell особливо корисний
Haskell особливо корисний для:
- функціонального програмування;
- компіляторів;
- DSL;
- parsers;
- складної бізнес-логіки;
- financial systems;
- validation;
- property-based testing;
- формального моделювання;
- high-assurance code;
- backend із type-safe API;
- research;
- навчання type systems;
- concurrency з STM;
- code where correctness matters.
Коли Haskell має змогу бути невдалим вибором
Haskell може бути невдалим вибором, якщо:
- потрібен великий ринок розробників;
- команда не знає FP;
- потрібен швидкий MVP із mainstream stack;
- потрібна AI/data science ecosystem;
- потрібен mobile app;
- потрібен простий CRUD без складної логіки;
- важливі low onboarding costs;
- tooling має бути максимально знайомим команді;
- проєкт залежить від багатьох mainstream SDK;
- lazy evaluation може ускладнити performance debugging для команди.
Типові помилки в Haskell
Поширені помилки:
- думати імперативно й боротися з мовою;
- боятися типів замість використати їх;
- зловживати language extensions;
- використовувати unsafePerformIO;
- не писати type signatures;
- використовувати String для великих текстів;
- ігнорувати strictness і space leaks;
- будувати надто складні type-level конструкції;
- не фіксувати GHC/package versions;
- не налаштувати formatter і HLS;
- не використовувати property-based testing;
- обирати Haskell для команди без FP-досвіду без плану навчання.
Хороші практики
Під час роботи з Haskell варто:
- Встановлювати toolchain через GHCup.
- Фіксувати версію GHC.
- Використовувати Cabal або Stack послідовно.
- Додавати type signatures для top-level functions.
- Моделювати domain через ADT.
- Використовувати Maybe/Either замість null-like підходів.
- Розділяти pure core і IO boundary.
- Писати property-based tests.
- Використовувати Text/ByteString для великих даних.
- Профілювати performance.
- Стежити за strictness.
- Обмежувати language extensions.
- Документувати складні типи.
- Налаштувати HLS у редакторі.
- Не зловживати type-level programming без потреби.
Практичний висновок
Haskell — потужна, виразна й незвична мова для тих, хто хоче писати код через типи, чисті функції й математичне мислення.
Сильні сторони:
- pure functions;
- immutability;
- lazy evaluation;
- referential transparency;
- strong static types;
- algebraic data types;
- pattern matching;
- type classes;
- monads;
- property-based testing;
- parsers;
- DSL;
- correctness;
- GHC;
- Cabal/Stack;
- Hackage/Stackage.
Обмеження:
- високий learning curve;
- менший ринок розробників;
- ecosystem менший за mainstream backend;
- lazy evaluation може ускладнювати performance;
- tooling залежить від версій GHC;
- type-level code може бути складним;
- не найкращий вибір для простих CRUD або mobile apps.
Haskell найкраще використовувати там, де складність логіки виправдовує сильну type system: компілятори, DSL, фінансові правила, parsers, validation, high-assurance systems і навчання глибокому функціональному мисленню.
Пояснення термінів
- Haskell — чиста функціональна мова програмування.
- GHC — Glasgow Haskell Compiler, головний компілятор Haskell.
- GHCi — інтерактивне середовище Haskell.
- GHCup — installer/manager для Haskell toolchain.
- Cabal — build system і package format для Haskell.
- Stack — build tool із фокусом на reproducible builds.
- HLS — Haskell Language Server.
- Hackage — repository Haskell packages.
- Stackage — curated package sets для Haskell.
- Pure function — функція без side effects.
- Referential transparency — можливість замінити expression його значенням без зміни поведінки.
- Immutability — незмінність значень.
- Lazy evaluation — відкладене обчислення до моменту потреби.
- Thunk — відкладене обчислення.
- Strictness — примусове або раннє обчислення.
- ADT — algebraic data type.
- Pattern matching — розбір значення за формою.
- Maybe — тип для optional value.
- Either — тип для результату або помилки.
- Type class — механізм polymorphism у Haskell.
- Functor — abstraction для mapping function over context.
- Applicative — abstraction для застосування functions у context.
- Monad — abstraction для послідовного поєднання effectful/contextual computations.
- IO — тип для операцій із зовнішнім світом.
- do notation — синтаксис для monadic code.
- Currying — подання функцій як послідовності одноаргументних функцій.
- QuickCheck — property-based testing library.
- STM — Software Transactional Memory.
- FFI — Foreign Function Interface.
- DSL — domain-specific language.
- Haddock — documentation generator для Haskell.
Дивіться додатково
Джерела
Приклад:
parseAmount :: String -> Either String Int
Haskell Language Server або HLS — language server для редакторів.; Типи допомагають:
- якщо транзакція не має змогу виконатися — вона retry;
- зміни або застосовуються разом, або не застосовуються;
- менше ручного lock management.; Function composition — один із ключових стилів Haskell-коду.; statusText Draft = "Чернетка"
FFI — Foreign Function Interface.;
Його майже ніколи не треба використовувати в звичайному application code.; instance Printable Customer where
</div>
Haskell має exceptions, але в чистому коді помилки часто краще моделювати типами:
Either
Приклад:
Це означає: статус замовлення має змогу бути тільки Draft, Paid або Cancelled.; sumList :: [Int] -> Int
У команді краще вибрати один formatter і запускати його в CI.;
== Web development ==
Приклад ідеї:
DSL
discount :: Int -> Int
Якщо customer не знайдено, наступний крок не виконується.; '''Applicative''' — abstraction між Functor і Monad.; У Haskell підхід інший:
double x = x * 2
Вони корисні для:
== Haskell і Python ==
Haskell корисний для:
Вона має integrated shrinking і сучасний підхід до generators.; Servant корисний для:
* уникати випадкової зміни стану;
* спрощувати reasoning;
* краще працювати з concurrency;
* зменшувати кількість bugs.; Головна ідея Haskell — будувати програми як композицію чистих функцій і точно описаних типів.; }
* typed DSL;
* compilers;
* interpreters;
* protocol modeling;
* state machines;
* advanced type-level programming.; '''GHC''' або '''Glasgow Haskell Compiler''' — центральний компілятор Haskell.;== Functor ==
Stack фокусується на reproducible builds і curated package sets через Stackage.; Але вона додатково має змогу створювати performance surprises, якщо не розуміти, коли саме обчислюються значення.;== IO Monad ==
У Haskell функції технічно приймають один аргумент і можуть повертати функцію.; * заборони неможливих станів;
* protocol correctness;
* dimensional analysis;
* typed APIs;
* DSL;
* compile-time validation.; name <- getLine
putStrLn ("Hello, " ++ name)
- bracket;
- resource management abstractions;
- conduit/pipes streaming libraries.; * systems programming;
- memory safety без GC;
- performance;
- embedded;
- low-level control.;
Практичне використання:
fmap (+1) (Just 10)
== Monad ==
Якщо в коді з’являється <code>unsafePerformIO</code>, потрібне дуже сильне обґрунтування й review.;<ref>https://www.haskell.org/ghc/blog/20250702-ghc-release-schedules.html</ref>
Вона надає можливість застосовувати function у контексті до value у контексті.; Він створює API documentation із коментарів у коді.;<ref>https://docs.haskellstack.org/en/stable/</ref>
count = 10
Haskell має сильну статичну типізацію.; Сценарії:
<pre>
Haskell має потужний type inference.; GHC має profiling tools.; Типові команди:
Він схожий на xUnit-style testing.; '''Чому QuickCheck важливий:''' він змушує думати не лише “чи функціонує цей приклад”, а “яка властивість має бути істинною для всіх допустимих inputs”.;<ref>https://www.haskell.org/downloads/</ref>
Це комфортно для APIs, configs і integrations.;== Haskell і ERP-системи ==
Records зручні для structured data.; як ілюстрація, Stackage Nightly 2026-05-06 використовував GHC 9.12.4.; Stackage має:
На продуктивність впливають:
== Haskell і Scala / OCaml / F# ==
* читання файлів;
* запису файлів;
* network;
* database;
* console;
* random;
* time;
* взаємодії з OS.;<pre>
Haskell має змогу викликати C-код і взаємодіяти з native libraries.; Higher-order functions дозволяють будувати дуже компактні transformations.; Sum types дозволяють моделювати бізнес-логіку без неявних null або magic strings.;== Stackage ==
Haddock важливий для libraries, packages і internal APIs.;
== Haskell і продуктивність ==
<pre>
== Exceptions ==
- ловити помилки під час компіляції;
- документувати наміри;
- моделювати domain;
- забороняти неможливі стани;
- робити refactoring безпечнішим.;
String у Haskell — це [Char], що має змогу бути неефективним для великих текстів.; main = do
* автодоповнення;
* diagnostics;
* go to definition;
* hover info;
* code actions;
* formatting;
* type information;
* інтеграцію з VS Code.; Haskell особливо сильний у [[Тестування коду|тестуванні коду]] завдяки наявності property-based testing.;<pre>
Недолік — менший ринковий сегмент розробників і вищий learning curve.;== Text і ByteString ==
== Profiling ==
Він дає:
'''Без містики:''' монада — це не “магія”.; '''HUnit''' — unit testing framework для Haskell.;[[Категорія:Пояснення термінів]]
</div>
Типовий підхід:
Потрібно контролювати:
* описати data type;
* deriving Generic;
* написати або згенерувати instances ToJSON/FromJSON.; Він робить їх явними у типах.;<ref>https://www.haskell.org/documentation/</ref>
<code>deriving</code> автономно створює instances.; Для рядків у production часто використовують не тільки <code>String</code>.;<pre>
'''HLint''' — популярний Haskell linter.; У Haskell space leaks часто пов’язані з laziness і thunks.;
Haskell не забороняє side effects.;
Immutability
Він пропонує спрощення коду й ідіоматичніші варіанти.;
QuickCheck генерує багато випадкових inputs і шукає counterexamples.; Компілятор змушує вас обробити випадок, коли значення немає.; '''Проста аналогія:''' Haskell змушує спочатку чітко описати “які значення можливі”, а вже потім писати код.; * моделювання складних бізнес-правил;
* DSL для правил;
* validation engine;
* parser для імпорту/експорту;
* type-safe API client;
* формальна перевірка частини логіки;
* property-based testing критичних алгоритмів;
* окремий сервіс для складних розрахунків.; putStrLn "What is your name?"
* <code>Eq</code> — порівняння на рівність;
* <code>Ord</code> — порядок;
* <code>Show</code> — перетворення в рядок;
* <code>Read</code> — читання з рядка.; * LTS snapshots;
* nightly snapshots;
* GHC version binding;
* curated ecosystem.; Замість перевірки одного прикладу описується властивість.;== Parser combinators ==
[[Категорія:Функціональне програмування]]
Практична користь: замість null Haskell використовує тип Maybe.; Недолік: compile time має змогу зростати, а код стає менш прозорим.; Приклад:
Ідея Stackage — мати набір package versions, які разом проходять build.; double :: Num a => a -> a
Чиста функція
findCustomer :: Int -> Maybe Customer
count :: Int
ADT допомагають явно описувати domain states.; GHC сам виведе тип.; * сильним типам;
- immutability;
- pure functions;
- явним effects;
- ADT;
- відсутності null у стилі mainstream-мов;
- property-based testing.; Type classes схожі на interfaces, але мають іншу семантику й велику роль у Haskell ecosystem.;== Higher-order functions ==
Це означає: спочатку toLower, потім trim.; main = putStrLn "Hello, Haskell"
Function composition
Haskell добре підходить для створення DSL завдяки наявності:
Але для основної ERP-розробки вибір Haskell має бути дуже свідомим: команда, супровід, deployment і інтеграції важливі не менше за красу типів.; Приклад:
name :: String
Profiling важливий, бо lazy evaluation має змогу створювати неочікувані memory patterns.;== JSON ==
5
Він не веде обліковий облік, не проводить документи й не керує складом сам по собі.;== Haskell і тестування коду ==
Інструменти:
Haskell має змогу взаємодіяти з C/C++ через FFI або wrappers.; GHC підтримує роботу багато language extensions.; sumList (x:xs) = x + sumList xs
Hedgehog часто використовують для складніших property tests.; discount amount
stack new my-project
Добрий Haskell-код часто явно описує business errors у типах.;<pre>
Він надає можливість генерувати код на compile time.; * memory leaks;
* накопичення thunks;
* неочікуваного використання пам’яті;
* performance problems.; Це спосіб акуратно з’єднувати обчислення, які мають контекст: Maybe, Either, IO, список, state, parser тощо.; Офіційна сторінка GHC описує його як state-of-the-art open source compiler and interactive environment for Haskell.; Вона вимагає іншого мислення, але користувачі можуть писати дуже передбачуваний код.;<ref>https://github.com/haskell/haskell-language-server/releases</ref>
Тип має змогу мати instance:
'''Either''' часто застосовують, коли потрібно для результату з помилкою.; Haskell має потужні функціональні можливості type-level programming.;[[Категорія:Type Systems]]
Applicative часто використовують у validation, parsing і configuration.; Ідея: API описується типом, а з цього можна отримувати server, client і documentation.; Можна переносити частину логіки в типи.; prop_reverseReverse xs =
Там публікуються libraries і tools.; '''IO''' — тип для операцій, які взаємодіють із зовнішнім світом.; |-
| '''Haskell''' || pure functional, lazy, дуже сильна type system
|-
| '''OCaml''' || functional-first, strict, сильний compiler, практична ML-family мова
|-
| '''F#''' || functional-first на .NET, добра інтеграційні функціональні можливості з Microsoft ecosystem
|-
| '''Scala''' || JVM, поєднання OOP і FP, сильна ecosystem для JVM/backend
|}
[[Категорія:Програмування]]
head numbers
Haskell можна використовувати для web/backend.; testAdd = TestCase (assertEqual "2+3" 5 (add 2 3))
== Pattern matching ==
== GHCup ==
Приклад:
data OrderStatus
Це робить код передбачуванішим і полегшує reasoning.;== Yesod ==
add a b = a + b
Haskell активно використовує functions як values.; У Haskell loops часто виражаються через recursion або higher-order functions.;
- files;
- network connections;
- database connections;
- handles;
- transactions.;== Algebraic Data Types ==
add :: Int -> Int -> Int