F # est dérivé d'OCaml, mais quels éléments principaux sont manquants ou ajoutés? Plus précisément, je suis curieux de savoir si les ressources disponibles pour apprendre OCaml sont également utiles à quelqu'un qui veut apprendre F #.
F # est dérivé d'OCaml, mais quels éléments principaux sont manquants ou ajoutés? Plus précisément, je suis curieux de savoir si les ressources disponibles pour apprendre OCaml sont également utiles à quelqu'un qui veut apprendre F #.
Réponses:
Les principales différences sont que F # ne prend pas en charge:
De plus, F # a une syntaxe différente pour les paramètres étiquetés et facultatifs.
En théorie, les programmes OCaml qui n'utilisent pas ces fonctionnalités peuvent être compilés avec F #. Apprendre OCaml est une introduction parfaitement raisonnable à F # (et vice versa, j'imagine).
La liste complète des différences est ici (note: archive.org remplacement du lien mort).
Cette question a reçu une réponse depuis un certain temps maintenant, mais j'ai été assez surpris que la plupart des réponses indiquent quelles fonctionnalités OCaml manquent dans F # - c'est vraiment bon de savoir si vous voulez porter des programmes OCaml existants vers F # (qui est probablement le motivation de la plupart des articles référencés). Cependant, il existe de nombreuses fonctionnalités qui font de F # un langage différent (pas seulement une version limitée d'OCaml pour .NET!) Voici quelques éléments qui sont ajoutés dans F #:
+
pour tous les types numériques ainsi que vos types qui le prennent en charge.Et, honnêtement, je pense qu'il vaut également la peine de mentionner l'IDE de Visual Studio. Cela ne fait pas partie du langage, mais cela améliore vraiment l'expérience utilisateur (la prise en charge d'IntelliSense dans Visual Studio est vraiment bonne!)
Si vous regardez la liste, il y a beaucoup de choses qui ont largement contribué à la popularité de F #, donc c'est bien plus que juste "OCaml sans foncteurs". F # est définitivement basé sur OCaml (et prend des idées d'autres langages tels que Haskell) et partage de nombreux aspects avec eux, mais il y a aussi beaucoup d'autres choses. Je suppose que sans des éléments tels que les flux de travail asynchrones, l'OO de style .NET et la méta-programmation, la Division des développeurs Microsoft n'inclurait jamais F # dans Visual Studio 2010.
<@ a @>
, sans parler des définitions de type comme <@ type t = int @>
et il ne peut pas gérer des grammaires arbitraires et des lexers et des analyseurs moins extensibles comme le fait Camlp4. L'absence d'un système macro décent est une lacune mais, à mon humble avis, le manque de lexers et d'analyseurs décents pour F # est un obstacle beaucoup plus grave. Je conseille en fait aux développeurs de créer leurs lexers et leurs analyseurs en utilisant OCaml, en se limitant au sous-ensemble pris en charge par F # et en le reportant sur F # afin de bénéficier du support supérieur d'OCaml!
Je décris toujours F # comme un cousin d'OCaml car OCaml a de nombreuses fonctionnalités que F # n'a pas et n'est jamais susceptible d'obtenir. F # est plus étroitement lié au langage CAML précédent. En particulier, F # a un support très limité pour l'abstraction et aucun support pour le typage structurel (comme les objets d'OCaml et les variantes polymorphes ) du tout.
Contrairement à ce que certains répondants ont écrit, F # a un support (limité) pour les arguments étiquetés ("nommés") et facultatifs.
Cependant, ce sont toutes des fonctionnalités avancées et vous pouvez certainement commencer à vous familiariser avec les idées de base derrière la programmation fonctionnelle à petite échelle de style OCaml en utilisant des ressources sur OCaml. La première différence majeure que vous découvrirez est des problèmes à plus grande échelle comme l'encapsulation et l'abstraction qui sont résolus de manière complètement différente en OCaml et en F #. Si vous voulez apprendre comment faire cela en F #, la seule littérature disponible est cet article sur les structures de données purement fonctionnelles .
J'ai également découvert que le merveilleux système de modules d'OCaml facilite le paramétrage du code sur des types (tels que des structures de données), mais les alternatives OOP sont non seulement hideuses mais presque entièrement inutilisées sur .NET. De plus, en essayant d'écrire des structures de données élégamment paramétrées, j'ai rencontré des dizaines de bogues dans le compilateur F # parce que personne n'a même tenté de le faire auparavant. Le F # stdlib contient de jolies implémentations de structure de données mais pratiquement aucune réutilisation, c'est-à-dire que c'est un travail de cut'n'paste.
F # et OCaml sont des classes taxonimiques dans la famille de langues ML, qui comprend également tout un passle d'autres animaux étranges. F # est plus récent que OCaml, et il n'a pas encore de foncteurs [fonctions du module -> module] ou de types de lignes [classes d'objets et variantes polymorphes]. Entre eux, ces deux simplifications facilitent probablement la courbe d'apprentissage pour quelqu'un qui développe sur la plateforme .Net. Malheureusement, ces deux fonctionnalités du langage sont extrêmement puissantes en OCaml, donc la lecture de la littérature OCaml pour obtenir des informations sur la façon de coder pour F # conduira probablement à une frustration prématurée avec ce dernier alors qu'il s'agit probablement d'une excellente alternative à C # où les deux sont disponibles.
F # prend directement en charge la syntaxe OCaml. Ce n'est peut-être pas 100% compatible, mais je pense que c'est assez proche.
http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html
Voici une liste de différences (je ne sais pas à quel point elle est à jour)
http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html