f# ocaml functor

F#cambia a OCaml



functor (5)

F # admite la sintaxis OCaml directamente. Puede que no sea 100% compatible, pero creo que es bastante cercano.

http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html

Aquí hay una lista de diferencias (no estoy seguro de cuán actualizado está)

http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html

F # se deriva de OCaml, pero ¿qué elementos principales faltan o se agregan? Específicamente, tengo curiosidad sobre si los recursos disponibles para aprender OCaml también son útiles para alguien que quiere aprender F #.


F # y OCaml son clases taxonímicamente en la familia de idiomas ML, que incluye un pase completo de otros animales extraños también. F # es más nuevo que OCaml, y no tiene ni functors [funciones de módulo -> módulo] ni tipos de filas [clases de objeto y variantes polimórficas] todavía. Entre ellos, esas dos simplificaciones probablemente hacen que la curva de aprendizaje sea más fácil para alguien que se está desarrollando en la plataforma .Net. Lamentablemente, esas dos características del lenguaje son muy poderosas en OCaml, por lo que leer la literatura de OCaml para obtener información sobre cómo codificar F # probablemente lleve a una frustración prematura con esta última cuando probablemente sea una excelente alternativa a C # cuando ambas estén disponibles.


Las principales diferencias son que F # no es compatible:

  • funtores
  • Objetos de estilo OCaml
  • variantes polimórficas
  • el preprocesador camlp4

Además, F # tiene una sintaxis diferente para los parámetros etiquetados y opcionales.

En teoría, los programas OCaml que no usan estas características se pueden compilar con F #. Aprender OCaml es una introducción perfectamente razonable a F # (y viceversa, me imagino).

La lista completa de diferencias está here (nota: reemplazo de archive.org del enlace inactivo).


Siempre describo F # como un primo de OCaml porque OCaml tiene muchas características que F # no tiene y que probablemente nunca llegue a tener. F # está más relacionado con el lenguaje CAML anterior. En particular, F # tiene un soporte muy limitado para la abstracción y ningún soporte para el tipado estructural (como los objects de OCaml y las variantes polimórficas ) en absoluto.

Al contrario de lo que algunos respondientes han escrito, F # tiene soporte (limitado) para argumentos etiquetados ("nombrados") y opcionales.

Sin embargo, estas son todas las características avanzadas y ciertamente puede comenzar a familiarizarse con las ideas básicas detrás de la programación funcional de estilo OCaml a pequeña escala utilizando recursos sobre OCaml. La primera gran diferencia que descubrirá son los problemas a mayor escala, como la encapsulación y la abstracción, que se resuelven de maneras completamente diferentes en OCaml y en F #. Si desea aprender cómo hacerlo en F #, la única literatura disponible es este artículo sobre estructuras de datos puramente funcionales .

También descubrí que el maravilloso sistema de módulos de OCaml facilita la parametrización de códigos sobre tipos (como las estructuras de datos), pero las alternativas OOP no solo son espantosas sino que prácticamente no se utilizan en .NET. Además, cuando intento escribir estructuras de datos elegantemente parametrizadas, toco docenas de errores en el compilador F # porque nadie ha intentado hacer esto antes. El F # stdlib contiene algunas buenas implementaciones de estructura de datos, pero prácticamente no se reutiliza, es decir, es un trabajo cortante y sin cortes.


Esta pregunta ha sido respondida desde hace algún tiempo, pero me sorprendió bastante que la mayoría de las respuestas diga qué características de OCaml faltan en F # - esto definitivamente es bueno saber si desea exportar los programas OCaml existentes a F # (que es probablemente el motivación de la mayoría de los artículos mencionados). Sin embargo, hay muchas características que hacen que F # sea un lenguaje diferente (¡no solo una versión limitada de OCaml para .NET!) Aquí hay un par de cosas que se agregan en F #:

  • Unidades de medida que le permiten verificar el tipo de código relacionado con cálculos numéricos
  • Meta-programación utilizando citas (lo que hace posible usar LINQ en F # y también es esencial para proyectos prometedores como la plataforma WebSharper)
  • Patrones activos para crear abstracciones para tipos de datos funcionales (y, en general, característica muy útil para aplicaciones de coincidencia de patrones más complicadas)
  • Expresiones de cálculo que es una función de lenguaje detrás de flujos de trabajo asíncronos (una biblioteca para E / S asíncrona / servicio web / programación GUI)
  • Sistema de objetos compatible con .NET que hace posible la interoperabilidad total con la plataforma .NET (OCaml también tiene un soporte para objetos pero diferente; hay, por supuesto, algunos beneficios en ambos sistemas).
  • Operadores sobrecargados : hasta donde yo sé, OCaml no tiene operadores sobrecargados, en F # puede usar + para todos los tipos numéricos, así como para los tipos que lo soportan.

Y, sinceramente, creo que también vale la pena mencionar el Visual Studio IDE. Esto no forma parte del lenguaje, pero realmente mejora la experiencia del usuario (¡el soporte de IntelliSense en Visual Studio es realmente bueno!)

Si nos fijamos en la lista, hay muchas cosas que contribuyeron en gran medida a la popularidad de F #, por lo que es mucho más que solo "OCaml sin funtores". F # está definitivamente basado en OCaml (y toma ideas de otros lenguajes como Haskell) y comparte muchos aspectos con ellos, sin embargo, también hay muchas otras cosas. Supongo que sin cosas como flujos de trabajo asincrónicos, estilo OO .NET y metaprogramación, la División de Desarrolladores de Microsoft nunca incluiría F # en Visual Studio 2010.