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


Esta pregunta comenzó a partir de

  1. Mi traducción de "ML para el programador de trabajo"(WorldCat) por L. C. PAULSON a F # que usa funtores para los ejemplos.
  2. Deseo eventual de traducir "Estructuras de datos puramente funcionales"(WorldCat) por Chris Okasaki que usa funtores.
  3. Leyendo "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 functors y trabajó con Microsoft .NET.
    * Ver: SML.NET Guía del usuario Sección 4.8.2 Tipos de clase 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 estos Q & A a CS: StackExchange.


32
2018-02-08 16:56


origen


Respuestas:


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 (por ejemplo, Standard ML, OCaml) tienen un pase llamado defunctorizar; 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 pueden ser directamente codificado 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 defunctorizar pase de MLton: defunctorize.fun

Actualizar: Pensé en cómo funcionan los funtores podría expresarse dentro del 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 verificarlo: funtores experimentales


39
2018-02-08 17:09