Seguindo o mesmo pensamento que esta declaração de Andrej Bauer nesta resposta
A comunidade Haskell desenvolveu várias técnicas inspiradas na teoria das categorias, das quais as mônadas são mais conhecidas, mas não devem ser confundidas com as mônadas .
Qual é a relação entre functores em SML e functores na teoria das categorias?
Como não conheço os detalhes de functors em outros idiomas, como Haskell ou OCaml, se houver informações de valor, adicione também seções para outros idiomas.
Respostas:
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 chamadaType
. Um construtor de tipo, comolist
ouarray
é uma função deType
paraType
. 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 universoType
de tipos pequenos. Os tipos grandes são geralmente chamados de tipos . Então nós temos:42 : int
:)Type
(exemploint : Type
:)OrderedType
:)list : Type -> Type
:)String : OrderedType
)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:
fonte
Uma estrutura ML padrão é semelhante a uma álgebra . Sua assinatura descreve uma classe inteira de álgebras de formato semelhante.
A maioria dessas idéias foi elaborada em uma série de artigos de Burstall e Goguen no design de uma linguagem de especificação chamada CLEAR (Referências c5 e c6 na página DBLP .) David MacQueen estava trabalhando em conjunto com Burstall e Sannella na época e estava intimamente familiarizado. com os problemas. O sistema do módulo ML padrão é baseado nessas idéias.
O que a maioria das pessoas se pergunta é: e os morfismos? Os functores teóricos da categoria têm uma parte do objeto e uma parte do morfismo. Os functores ML padrão têm o mesmo? A resposta é sim e não.
Isso significa que o Padrão ML está se desviando da teoria das categorias? Acho que não. Eu prefiro pensar que o Standard ML está fazendo a coisa certa, e a teoria das categorias ainda não foi alcançada. A teoria das categorias ainda não sabe como lidar com funções de ordem superior. Algum dia, será.
fonte
Até onde eu sei, não existe uma relação formal entre functores na teoria das categorias e functores no ML (SML ou OCaml, eles estão próximos o suficiente para o nosso propósito aqui).
Na teoria das categorias, functores são funções que operam em objetos. Eles estão um nível acima dos morfismos, que geralmente são funções que operam em elementos (muitas categorias têm objetos que são conjuntos com alguma estrutura algébrica e setas que são homomorfismos entre essas estruturas). Um functor ML é uma função que opera em módulos, um nível acima das funções que operam nos valores principais da linguagem. Eu acho que a semelhança para aqui.
Os functores de ML foram batizados por Dave McQueen em sua revisão de 1985 do Modules for Standard ML (citeseerx) que apareceu no Boletim de Polimorfismo (o artigo original usava a expressão "módulo paramétrico" - publicações posteriores tendem a usar o adjetivo "parametrizado"). Infelizmente, não consigo localizar uma cópia desse papel. Em seu artigo de 1986, Usando tipos dependentes para expressar estrutura modular (citeseerx), ele fornece o nome como estabelecido.
fonte