2008-10-07 27 views
114

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

+8

** Atención: ** si está interesado en el destino de esto pregunta, únase a la discusión sobre [Meta Stack Overflow] (http://meta.stackexchange.com/questions/131289/why-was-this-question-closed-f-and-ocaml/) o discútalo en [chat ] (http://chat.stackoverflow.com/rooms/5/the-so-tavern-general) - los comentarios aquí fueron extraordinariamente improductivos, así que los eliminé. – Shog9

+3

[Otra comparación] (http://pauillac.inria.fr/~nakata/FSharp.html) desde la perspectiva de un desarrollador de OCaml, por lo que es bastante parcial pero útil, no obstante. –

+1

@MauricioScheffer ¡Enlace roto! –

Respuesta

79

Las principales diferencias son que F # no soporta:

  • functors
  • OCaml-style objects
  • variantes polimórficas
  • el preprocesador camlp4

Además, F # tiene una sintaxis diferente para los parámetros marcados 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 las diferencias es here (nota: reemplazo de archive.org del enlace inactivo).

+3

¿Hay un equivalente camlp4 para F #? – nlucaroni

+0

No lo creo. Pero puede canalizar su programa a través de camlp4 y en el compilador F #, probablemente. (No lo recomendaría). –

+5

F # tiene argumentos con nombre y opcionales pero usa una sintaxis y semántica diferentes. Tendrá problemas para usar Camlp4 con F # porque F # casi siempre es sensible a las indentaciones, por lo que necesitará un nuevo lexer y la documentación de Camlp4 en los lexers no se ha escrito durante casi dos años. –

2

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í está una lista de diferencias (no sé cómo hasta a la fecha en que quede)

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

+1

"F # admite la sintaxis de OCaml directamente. Puede que no sea 100% compatible, pero creo que es bastante cercano". IME el soporte del compilador F # para la compatibilidad OCaml es muy defectuoso. Esto puede dificultar el acceso a las bases de código OCaml existentes a F # porque el compilador F # muere internamente en un código válido. –

+0

Todos los enlaces están muertos. – Wingjam

15

Siempre describo F # como primo de OCaml porque OCaml tiene muchas características que F # no tiene y que es probable que nunca obtenga. F # está más relacionado con el lenguaje CAML anterior. En particular, F # tiene un soporte muy limitado para la abstracción y no admite el tipado estructural (como OCaml's objects y polymorphic variants) en absoluto.

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

Sin embargo, estas son todas las funciones avanzadas y sin duda 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 documentación disponible es this article on purely functional data structures.

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 casi 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.

+25

Todos los enlaces requieren suscripciones pagas. – Will

+1

@Parecen ser un complemento desvergonzado para las cosas que Jon Harrop escribió (él aparece como el autor cada vez) – symbiont

+0

@symbiont Sí, sabemos que es un poco basura. Sería bueno si vinculaste a alguna información adicional que fuera gratuita. Pero la respuesta está bien sin los enlaces, así que ahí está. – Will

8

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.

104

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

  • Las unidades de medida que permiten que escriba comprobación de código se trata de cálculos numéricos
  • Meta de programación usando citas (que hace posible el uso de LINQ en Fa # y también es esencial para proyectos promisorios como la plataforma WebSharper)
  • patrones activos de creando abstracciones para datos funcionales tipos (y característica general muy útil para las aplicaciones más complicadas de coincidencia de patrones)
  • Computación expresiones que es una característica del lenguaje detras flujos de trabajo asíncrono (una biblioteca para O/servicio web programación asincrónica de E// GUI)
  • El 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 - Por lo que sé, OCaml no tiene operadores sobrecargados - en F # puede usar + para todos los tipos numéricos y sus tipos que lo admitan.

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 mira la lista, hay muchas cosas que contribuyeron en gran medida a la popularidad de F # , entonces 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.

+10

¡Gracias! La mayoría de las personas se concentran en lo que falta en F #, pero también quería ver lo que faltaba en OCaml. –

+18

Woah! OCaml se crió específicamente para la metaprogramación, es muy superior a F # y .NET en ese contexto. Camlp4 es un sistema de cotización mucho más poderoso que F # 's. Los lectores y analizadores de OCaml son mucho mejores que cualquier cosa disponible para .NET. Además, las macros Camlp4 están disponibles que implementan patrones activos y expresiones de cálculo. OCaml también tiene IDEs que proporcionan los mismos beneficios que Visual Studio para F #. –

+3

Las citas de F # tienen un objetivo completamente diferente de lo que está disponible en Camlp4 (aparte de esto, este no es el lenguaje OCaml, sino que es un sistema además), por lo que no es justo compararlos. La existencia de Camlp4 es sin duda una ventaja de OCaml, pero no tiene nada que ver con las citas (que permiten cosas como WebSharper, ejecutando F # en GPU, etc.) –