Категорії утворюють (велику) категорію, об'єктами якої є (малі) категорії, морфізми яких є функціоналами між малими категоріями. У цьому сенсі функтори в теорії категорій - це "великі морфізми".
ML-функтори - це не функтори в категоричному сенсі цього слова. Але вони є "функціями більшого розміру" у теоретико-теоретичному сенсі.
Подумайте про конкретні типи даних у типовій мові програмування як "малі". Таким чином int
, bool
і int -> int
т. Д. Невеликі, заняття в java невеликі, як і структури в C. Ми можемо зібрати всі типи даних у велику колекцію, що називається Type
. Конструктор типу, такий як list
або array
є функцією від Type
до Type
. Отже, це "велика" функція. Функція ML - лише трохи складніша велика функція: вона приймає в якості аргументу кілька дрібних речей і повертає кілька дрібних речей. "Кілька дрібних речей, зібраних разом" відома як структура в ML. З точки зору теорії типу Мартіна-Лефа, ми маємо Всесвіт Type
малих типів. Великі типи зазвичай називають видами . Отже, ми маємо:
- Значення - це елементи типів (приклад
42 : int
:)
- типи - це елементи
Type
(приклад int : Type
:)
- Підписи ML - види (наприклад
OrderedType
:)
- конструктори типу - це елементи типу (наприклад
list : Type -> Type
:)
- ML СТРУКТУР є елементами видів (приклад:
String : OrderedType
)
- ML функтори функції між видами (наприклад
Map.Make : Map.OrderedType -> Make.S
)
Тепер ми можемо провести аналогію між ML та категоріями, згідно з якими функтори відповідають функторам. Але ми також помічаємо, що типи даних в ML є як "малі категорії без морфізмів", іншими словами вони схожі на множини більше, ніж вони схожі на категорії. Тоді ми могли б використати аналогію між ML та теорією множин:
- типи даних - це як набори
- види схожі на множинно-теоретичні класи
- функтори - це як функції розміру класу