Термінологія
Типізація
Є чотири основних категорії типізації в мовах програмування. Коротко про кожну з них.
Типізовані / нетипізовані - мова Assembler, наприклад, не має типів як таких, ви просто оперуєте регістрами, вона - нетипізована. Всі інші мови типізовані.
Статична / динамічна - в статичній типізації типи змінних і функцій встановлюються на момент компіляції програми, тобто на момент виконання програми достовірно відомо, яка змінна має який тип. В динамічній типізації тип змінної визначається в ході виконання програми.
Сильна / слабка (стога / нестрога) - якщо типізація слабка, то мова дозволяє в одному виразі змішувати змінні декількох типів, а перетворення будуть відбуватися атоматично і неявно приводитися з одного типу до іншого правилами, які визначає сама мова. Сильна типізація заборонить подібну операцію, наприклад, додавання числа до рядка символів.
Явна / неявна - явно типізовані мови вимагають вказанні типів для змінної під час її оголошення, в той час як неявні самі визначать тип на етапі компіляції чи інтерпретації.
Пайтон, наприклад, є типізованою мовою з динамічною, строгою, неявною типізацією.
Поняття з функціонального програмування
Почнемо з простого поняття змінної. Змінній може бути присвоєне деяке значення. І ми можемо викликати функцію, використовуючи змінну як аргумент. Тепер введемо поняття контексту. Це деяка додаткова інформація про те, яке значення міститься у змінній. Розглядаємо контекст, як деяку коробку, в яку можна помістити значення.
Тепер ми не можемо просто застосувати функцію, оскільки результат буде залежати від контексту.
Functors (функтори) - знають як застосовувати функцію до значення в контексті.
Тепер уявімо, що функція теж загорнута в деякий контекст. Незрозуміло, як її використати з нашою змінною.
Applicatives (аплікативи) - вміють застосовувати функції в контексті до змінних в контексті.
Аплікативи “дістають” функцію та значення з контекстів і повертають результат теж у контексті.
Monads (монади) - застосовують функцію, що повертає значення в контексті до деякого іншого значення в контексті.
Монади можна поєднувати в ланцюжок, результатом на виході кожної ланки якого бути значення в контексті. Деяка сутність може бути одночасно і функтором, і аплікативом, і монадою.
Дискретна математика
Імплікація - це логічна звʼязка виду “якщо деякий факт, то деякий інший факт“. Перший факт є посиланням, а другий факт - наслідком. Імплікація як булева функція хибна лише тоді, коли посилання істинне, а наслідок хибний. Якщо імплікація істинна в обидві сторони (A→B і B→A) - це називається логічною еквівалентністю (в логічних висловлюваннях означає тоді і тільки тоді).
Ідемпотентність - це властивість обʼєкта, яка полягає у тому, що повторна дія над ним не змінює його. Наприклад, функцію можна назвати ідемпотентною, якщо застосування її з тим самим аргументом двічі не змінить результат. Те ж можна сказати відносно деякої операції. Тобто, застосування ідемпотентних функцій чи операцій декілька разів є безпечним.