As categorias formam uma categoria (grande) cujos objetos são as categorias (pequenas) e cujos morfismos são functores entre categorias pequenas. Nesse sentido, os functores na teoria das categorias são "morfismos de maior tamanho".
Os functores ML não são functores no sentido categórico da palavra. Mas elas são "funções de tamanho maior" no sentido da teoria dos tipos.
Pense em tipos de dados concretos em uma linguagem de programação típica como "pequeno". Assim int
, bool
, int -> int
, etc são pequenos, aulas de Java são pequenos, como estruturas bem em C. Podemos recolher todos os tipos de dados em uma grande colecção de chamada Type
. Um construtor de tipo, como list
ou array
é uma função de Type
para Type
. Portanto, é uma função "grande". Um functor ML é apenas uma função grande um pouco mais complicada: aceita como argumento várias pequenas coisas e retorna várias pequenas coisas. "Várias pequenas coisas juntas" são conhecidas como estrutura no ML. Em termos da teoria dos tipos de Martin-Löf, temos um universo Type
de tipos pequenos. Os tipos grandes são geralmente chamados de tipos . Então nós temos:
- valores são elementos de tipos (exemplo
42 : int
:)
- tipos são elementos de
Type
(exemplo int : Type
:)
- Assinaturas de ML são tipos (exemplo
OrderedType
:)
- construtores de tipos são elementos de tipos (exemplo
list : Type -> Type
:)
- Stuctures ml são elementos de tipos (exemplo:
String : OrderedType
)
- Functors ml são funções entre os tipos (exemplo:
Map.Make : Map.OrderedType -> Make.S
)
Agora podemos traçar uma analogia entre ML e categorias, sob a qual functors correspondem a functors. Mas também observamos que os tipos de dados no ML são como "pequenas categorias sem morfismos", em outras palavras, são mais como conjuntos do que como categorias. Poderíamos usar uma analogia entre ML e teoria dos conjuntos:
- tipos de dados são como conjuntos
- tipos são como classes teóricas
- functores são como funções de tamanho de classe