Pregunta

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

¿Fue útil?

Solución

Las principales diferencias son que F # no admite:

  • funtores
  • objetos de estilo OCaml
  • variantes polimórficas
  • el preprocesador de camlp4 / 5 o los puntos de extensión (ppx)

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

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

La lista completa de diferencias es here (nota: archive.org reemplazo del enlace muerto).

Otros consejos

Esta pregunta ha sido respondida desde hace algún tiempo, pero me sorprendió bastante que la mayoría de las respuestas digan qué funciones de OCaml faltan en F #. Esto es definitivamente bueno saber si desea transferir los programas existentes de OCaml a F # (que Es probablemente la motivación de la mayoría de los artículos referenciados). Sin embargo, hay muchas características que hacen que F # sea un idioma 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 usando citas (lo que hace posible usar LINQ en F # y también es esencial para proyectos en proceso como la plataforma WebSharper)
  • Patrones activos para crear abstracciones para tipos de datos funcionales (y una característica generalmente 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 de GUI)
  • Sistema de objetos compatible con .NET que hace posible interoperar completamente con la plataforma .NET (OCaml también tiene soporte para objetos, pero es diferente. Por supuesto, hay 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, así como los tipos que apoyalo.

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

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

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

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

Sin embargo, estas son todas características avanzadas y ciertamente puede comenzar a familiarizarse con las ideas básicas detrás de la programación funcional al estilo de OCaml a pequeña escala utilizando recursos sobre OCaml. La primera diferencia importante que descubrirá es que los problemas a gran escala, como la encapsulación y la abstracción, 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 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 del código sobre tipos (como las estructuras de datos), pero las alternativas OOP no solo son horribles, sino que casi no se utilizan en .NET. Además, cuando intento escribir estructuras de datos con parámetros elegantes, encuentro docenas de errores en el compilador F # porque nadie ha intentado hacerlo antes. F # stdlib contiene algunas implementaciones de estructura de datos agradables, pero prácticamente no se puede reutilizar, es decir, es un trabajo de cortar y pegar.

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

F # admite sintaxis OCaml directamente. Puede que no sea 100% compatible, pero creo que está bastante cerca.

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top