haskell ocaml

¿Cómo se parecen los funtores en Haskell y OCaml?



(1)

Desde un punto de vista práctico, puede pensar en "funtores" en OCaml y Haskell como no relacionados. Como dijiste, en Haskell un functor es cualquier tipo que te permita mapear una función sobre él. En OCaml, un funtor es un módulo parametrizado por otro módulo.

En la programación funcional, ¿qué es un funtor? tiene una buena descripción de los funtores en los dos idiomas y cómo difieren .

Sin embargo, como su nombre lo indica, ¡en realidad hay una conexión entre los dos conceptos aparentemente dispares! Los dos fundadores de ambos idiomas son solo realizaciones de un concepto de la teoría de categorías.

La teoría de categorías es el estudio de categorías, que son simplemente colecciones arbitrarias de objetos con "morfismos" entre ellos. La idea de una categoría es muy abstracta, de modo que los "objetos" y los "morfismos" realmente pueden ser cualquier cosa con algunas restricciones; tiene que haber un morfismo de identidad para cada objeto y los morfismos deben componerse.

El ejemplo más obvio de una categoría es la categoría de conjuntos y funciones: los conjuntos son los objetos y las funciones entre los conjuntos los morfismos. Claramente, cada conjunto tiene una función de identidad y se pueden componer funciones. Se puede formar una categoría muy similar al observar un lenguaje de programación funcional como Haskell u OCaml: los tipos de hormigón (por ejemplo, tipos con tipo * ) son los objetos y las funciones de Haskell / OCaml son los morfismos entre ellos.

En la teoría de categorías, un functor es una transformación entre categorías. Es como una función entre categorías. Cuando miramos la categoría de tipos de Haskell, un functor es esencialmente una función de tipo de nivel: asigna tipos a otra cosa. El tipo particular de functor que nos importa acerca de los tipos de mapas a otros tipos. Un ejemplo perfecto de esto es Maybe : Maybe maps Int to Maybe Int , String to Maybe String y así sucesivamente. Proporciona un mapeo para cada tipo de Haskell posible.

Los funtores tienen un requerimiento adicional: tienen que mapear los morfismos de la categoría así como también los objetos. En particular, si tenemos un morfismo A → B y nuestro functor asigna A a A'' y B a B'' , tiene que mapear el morfismo A → B con algún morfismo A'' → B'' . Como ejemplo concreto, digamos que tenemos los tipos Int y String . Hay un montón de funciones de Haskell Int → String . Para que Maybe sea ​​un functor apropiado, tiene que tener una función Maybe Int → Maybe String para cada uno de estos.

Afortunadamente, esto es exactamente lo que hace la función fmap : mapea funciones. Para Maybe , tiene el tipo (a → b) → Maybe a → Maybe b ; podemos agregar algunos paréntesis para obtener: (a → b) → (Maybe a → Maybe b) . Lo que este tipo de firma nos dice es que para cualquier función normal que tenemos, también tenemos una función correspondiente sobre Maybe s.

Entonces, un functor es un mapeo entre tipos que también conserva las funciones entre ellos. La función fmap es esencialmente solo una prueba de esta segunda restricción en functors. Esto hace que sea fácil ver cómo la clase Haskell Functor es solo una versión particular del concepto matemático.

Entonces, ¿qué hay de OCaml? En OCaml, un funtor no es un tipo, es un módulo . En particular, es un módulo parametrizado: un módulo que toma otro módulo como argumento. Ya podemos ver algunos paralelismos: en Haskell, un Functor es como una función de tipo de nivel; en OCaml, un functor es como una función de nivel de módulo . Entonces, realmente, es la misma idea matemática; sin embargo, en lugar de usarse en tipos, como en Haskell, se usa en módulos .

Hay muchos más detalles sobre cómo los funtores de OCaml se relacionaron con los funtores de la teoría de categorías en el sitio de CS: ¿Cuál es la relación entre los funtores en SML y la teoría de categorías? . La pregunta habla sobre SML en lugar de OCaml per se , pero tengo entendido que el sistema de módulos de OCaml está muy relacionado con el de SML.

En resumen: los funtores en Haskell y OCaml son dos estructuras fundamentalmente diferentes que resultan ser reificaciones de la misma idea matemática muy abstracta. Creo que es bastante limpio :).

He estado jugando en un Haskell durante el año pasado y estoy empezando a ''conseguir'', hasta Mónadas, Lentes, Familias tipo, ... todo.

Estoy a punto de dejar esta zona de confort un poco y me estoy mudando a un proyecto OCaml como un trabajo diario. Pasando por la sintaxis un poco, estaba buscando conceptos similares de nivel superior, como por ejemplo functor.

Leí el código en OCaml y la estructura de un funtor pero parece que no entiendo si ahora son conceptos similares en Haskell y OCaml o no. En pocas palabras, un functor en Haskell es para mí principalmente una forma de levantar funciones en Haskell y lo uso (y me gusta) así. En OCaml me da la sensación de que está más cerca de la programación de una interfaz (por ejemplo, al hacer un conjunto o una lista, con esa función de comparación) y realmente no sabría cómo, por ejemplo, levantar funciones sobre el funtor.

¿Puede alguien explicarme si los dos conceptos son similares y, en caso afirmativo, qué es lo que me falta o no veo? Busqué en Google un poco y no parece haber una respuesta clara para ser encontrado.

Kasper