f# ocaml sml functor ml

Si SML.NET tenía funtores ¿por qué no puede F#?



ocaml functor (1)

Esta pregunta comenzó a partir de

  1. Mi traducción de " ML para el programador de trabajo " ( WorldCat ) de LC PAULSON a F #, que utiliza funtores para los ejemplos.
  2. Posible deseo de traducir " Estructuras de datos puramente funcionales " ( WorldCat ) por Chris Okasaki, que utiliza funtores.
  3. Lectura " CATEGORÍAS TIPOS Y ESTRUCTURAS - Introducción a la teoría de categorías para el científico informático que trabaja " ( WorldCat ) por Andrea Asperti y Giuseppe Longo.
  4. No lo entiendo todo, principalmente la teoría de categorías.

SML.NET puede hacer funtores y trabajó con Microsoft .NET.
* Consulte: SML.NET User Guide Sección 4.8.2 Tipos de clases y funtores?

Sigo viendo que F # no puede hacer functors verdaderos debido a alguna limitación en Microsoft .NET.
* ¿Pueden los codificadores ML ser completamente codificados en .NET (C # / F #)?
* ¿ Alguna solución para el functor?

Entonces, si SML.NET podría hacer functors en .NET, ¿por qué no puede F #? ¿Qué hizo SML.NET que F # no puede?

Cuanto más aprendo acerca de los funtores que provienen de la teoría de categorías, más veo la belleza de ellos y deseo tenerlos en F #.

EDITAR

En una búsqueda para comprender mejor la relación entre la teoría de categorías y la programación funcional, vea estas Q&A CS:StackExchange en CS:StackExchange .


No existe una limitación fundamental de .NET que impida que los funtores se implementen en F #. Es cierto que no se pueden representar directamente en los metadatos .NET, pero tampoco otras características del lenguaje F # como los tipos de unión. Los compiladores de idiomas con funtores (p. Ej., Estándar ML, OCaml) tienen un pase llamado defunctorize ; funciona igual que la expansión de plantilla C ++, en el sentido de que "aplana" los funtores al especializarlos en módulos normales.

El compilador F # podría hacer lo mismo, pero luego debe preguntar: ¿cómo se expondrá esto a otros lenguajes .NET? Como los funtores no se pueden codificar directamente en el sistema de tipo .NET, necesitaría encontrar alguna forma de representarlos; y si esa representación es difícil / imposible de usar desde C # o VB.NET, ¿tendría sentido incluir funtores F #? Una parte no trivial del éxito de F # proviene de su capacidad de interoperar fácilmente (en ambas direcciones) con C # y VB.NET.

EDITAR: No me malinterpreten. Me encantaría tener funcionadores en F #, serían realmente útiles para manejar algunos casos que son actualmente dolorosos y / o imposibles de implementar sin ellos. Solo estoy señalando que la razón principal por la que el lenguaje aún no tiene funtores (y tal vez nunca lo hará) es que el problema de la interoperabilidad no se ha resuelto; el problema de la codificación de metadatos es realmente la parte fácil.

EDIT 2: Código para el pase defunctor de MLton : defunctorize.fun

Actualización: Pensé en cómo se podían expresar los funtores en el sistema de tipo .NET, así que armé un pequeño experimento. No es bonito, pero funciona, así que ahora sabemos que es posible que F # un día apoye a los funtores. En la práctica, la complejidad que ve en mi código experimental estaría oculta por el compilador / lenguaje. Si quieres comprobarlo: experimental-functors