Các danh mục tạo thành một phạm trù (lớn) có đối tượng là các phạm trù (nhỏ) và hình thái của chúng là các chức năng giữa các phạm trù nhỏ. Theo nghĩa này, functor trong lý thuyết thể loại là "hình thái kích thước cao hơn".
ML functor không phải là functor theo nghĩa phân loại của từ này. Nhưng chúng là "các hàm kích thước cao hơn" theo nghĩa lý thuyết loại.
Hãy nghĩ về các kiểu dữ liệu cụ thể trong một ngôn ngữ lập trình điển hình là "nhỏ". Do đó int
, bool
, int -> int
, vv là nhỏ, các lớp trong java là nhỏ, như cấu trúc tốt trong C. Chúng tôi có thể thu thập tất cả các kiểu dữ liệu thành một bộ sưu tập lớn gọi Type
. Một hàm tạo kiểu, chẳng hạn như list
hoặc array
là một hàm từ Type
đến Type
. Vì vậy, nó là một chức năng "lớn". Một functor ML chỉ là một hàm lớn phức tạp hơn một chút: nó chấp nhận như một đối số một vài điều nhỏ và nó trả về một vài điều nhỏ. "Một số thứ nhỏ ghép lại với nhau" được gọi là cấu trúc trong ML. Về mặt lý thuyết loại Martin-Löf, chúng ta có một vũ trụ Type
gồm các loại nhỏ. Các loại lớn thường được gọi là các loại . Vì vậy chúng tôi có:
- giá trị là các phần tử của các loại (ví dụ
42 : int
:)
- loại là các yếu tố của
Type
(ví dụ int : Type
:)
- Chữ ký ML là các loại (ví dụ
OrderedType
:)
- các hàm tạo kiểu là các phần tử của các loại (ví dụ
list : Type -> Type
:)
- Quy tắc ML là các yếu tố của các loại (ví dụ
String : OrderedType
:)
- Chức năng ML là các hàm giữa các loại (ví dụ
Map.Make : Map.OrderedType -> Make.S
:)
Bây giờ chúng ta có thể rút ra sự tương đồng giữa ML và các danh mục, theo đó functor tương ứng với functor. Nhưng chúng tôi cũng nhận thấy rằng các kiểu dữ liệu trong ML giống như "các phạm trù nhỏ không có hình thái", nói cách khác, chúng giống như các tập hợp nhiều hơn chúng giống như các thể loại. Chúng ta có thể sử dụng một sự tương tự giữa ML và lý thuyết tập hợp sau đó:
- kiểu dữ liệu giống như bộ
- các loại giống như các lớp lý thuyết tập hợp
- functor giống như các hàm cỡ lớp