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 quiera aprender F #.
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 quiera aprender F #.
Respuestas:
Las principales diferencias son que F # no admite:
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á aquí (nota: reemplazo de archivo muerto de archive.org).
Esta pregunta se ha respondido desde hace algún tiempo, pero me sorprendió bastante que la mayoría de las respuestas digan qué características de OCaml faltan en F #; esto es definitivamente bueno saber si desea portar los programas de OCaml existentes a F # (que probablemente sea el motivación de la mayoría de los artículos referenciados). Sin embargo, hay muchas características que hacen de F # un idioma diferente (¡no solo una versión limitada de OCaml para .NET!) Aquí hay un par de cosas que se agregan en F #:
+
para todos los tipos numéricos, así como para los tipos que lo admiten.Y, sinceramente, creo que también vale la pena mencionar el IDE de Visual Studio. Esto no es parte del lenguaje, pero realmente mejora la experiencia del usuario (¡el soporte de IntelliSense en Visual Studio es realmente bueno!)
Si observa la lista, hay muchas cosas que contribuyeron en gran medida a la popularidad de F #, por lo que es mucho más que simplemente "OCaml sin functors". F # se basa definitivamente 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 asincrónicos, OO de estilo .NET y metaprogramación, la División de Desarrolladores de Microsoft nunca incluiría F # en Visual Studio 2010.
<@ a @>
, y mucho menos escribir definiciones como <@ type t = int @>
y no puede manejar gramáticas arbitrarias, mucho menos lexers y analizadores extensibles como lo hace Camlp4. La falta de un sistema macro decente es una deficiencia, pero, en mi humilde opinión, la falta de lexers y analizadores decentes para F # es un impedimento mucho más grave. De hecho, ¡aconsejo a los desarrolladores que creen sus lexers y analizadores utilizando OCaml, restringiéndose al subconjunto que admite F # y transfiriéndolo de nuevo a F # para beneficiarse del soporte de herramientas superior de OCaml!
Siempre describo a F # como primo de OCaml porque OCaml tiene muchas características que F # no tiene y que probablemente nunca tendrá. F # está más estrechamente relacionado con el lenguaje CAML anterior. En particular, F # tiene un soporte muy limitado para la abstracción y ningún soporte para la tipificación estructural (como los objetos de OCaml y las variantes polimórficas ).
Al contrario de lo que han escrito algunos encuestados, F # tiene soporte (limitado) para argumentos etiquetados ("con nombre") 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 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 del código sobre los tipos (como las estructuras de datos), pero las alternativas OOP no solo son horribles sino que casi no se usan en .NET. Además, cuando intento escribir estructuras de datos elegantemente parametrizadas, encuentro docenas de errores en el compilador de F # porque nadie ha intentado hacerlo antes. El F # stdlib contiene algunas implementaciones agradables de la estructura de datos, pero prácticamente no se reutiliza, es decir, es un trabajo de cortar y pegar.
F # y OCaml son clases taxonómicas en la familia de idiomas ML, que también incluye un conjunto completo de otros animales extraños. F # es más nuevo que OCaml, y todavía no tiene functores [funciones del módulo -> módulo] o tipos de fila [clases de objetos y variantes polimórficas]. Entre ellas, esas dos simplificaciones probablemente hagan que la curva de aprendizaje sea más fácil para alguien que desarrolle 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 conducirá a una frustración prematura con este último cuando probablemente sea una excelente alternativa a C # donde ambos están disponibles.
F # admite la sintaxis de 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 qué tan actualizada está)
http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html