web-dev-qa-db-fra.com

F # change pour OCaml

F # est dérivé d'OCaml, mais quels sont les principaux éléments 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 #.

123
Erik Forbes

Les principales différences sont que F # ne prend pas en charge:

  • foncteurs
  • Objets de style OCaml
  • variantes polymorphes
  • le préprocesseur camlp4/5 ou les points d'extension (ppx)

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: remplacement par archive.org du lien mort).

87
Chris Conway

On a répondu à cette question depuis un certain temps maintenant, mais j'ai été assez surpris que la plupart des réponses disent quelles fonctionnalités OCaml manquent dans F # - c'est certainement bon de savoir si vous voulez porter des programmes OCaml existants sur 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 #:

  • nités de mesure qui vous permettent de taper le code traitant des calculs numériques
  • Méta-programmation en utilisant des devis (ce qui permet d'utiliser LINQ en F # et est également essentiel pour des projets prometteurs comme la plate-forme WebSharper)
  • Modèles actifs pour créer des abstractions pour les types de données fonctionnels (et fonctionnalité généralement très utile pour les applications de correspondance de modèles plus compliquées)
  • expressions de calcul qui est une fonctionnalité de langage derrière workflows asynchrones (une bibliothèque pour les E/S asynchrones/service Web/programmation GUI)
  • système d'objet compatible .NET qui permet une interaction complète avec la plate-forme .NET (OCaml prend également en charge des objets mais différents - il y a bien sûr certains avantages dans les deux systèmes).
  • Opérateurs surchargés - Pour autant que je sache, OCaml n'a pas d'opérateurs surchargés - en F # vous pouvez utiliser + pour tous les types numériques ainsi que ceux qui le prennent en charge.

Et, honnêtement, je pense qu'il convient également 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 #, c'est donc bien plus que "OCaml sans foncteurs". F # est certainement basé sur OCaml (et prend des idées d'autres langues telles que Haskell) et partage de nombreux aspects avec eux, mais il y a aussi beaucoup d'autres choses. Je suppose que sans des choses comme les flux de travail asynchrones, le style .NET OO et la méta-programmation, la division des développeurs Microsoft n'inclurait jamais F # dans Visual Studio 2010.

116
Tomas Petricek

Je décris toujours F # comme un cousin d'OCaml car OCaml possède de nombreuses fonctionnalités que F # n'a pas et ne sera 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 objets et variantes polymorphes ) d'OCaml.

Contrairement à ce que certains répondants ont écrit, F # a un support (limité) pour les arguments étiquetés ("nommés") et optionnels.

Cependant, ce sont toutes des fonctionnalités avancées et vous pouvez certainement commencer à vous familiariser avec les idées de base de la programmation fonctionnelle de style OCaml à petite échelle 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 dans OCaml et dans F #. Si vous voulez apprendre à le faire en F #, la seule documentation 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 les types (tels que les 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 paramétrées avec élégance, j'ai rencontré des dizaines de bogues dans le compilateur F # parce que personne n'a même essayé de le faire auparavant. 'coller le travail.

16
Jon Harrop

F # et OCaml sont des classes taxinimiques dans la famille de langues ML, qui comprend également tout un tas d'autres animaux étranges. F # est plus récent que OCaml, et il n'a pas encore de foncteurs [fonctions du module -> module] ni de types de lignes [classes d'objets et variantes polymorphes]. Entre eux, ces deux simplifications rendent probablement la courbe d'apprentissage plus facile pour quelqu'un qui développe sur la plate-forme .Net. Malheureusement, ces deux fonctionnalités de langage sont extrêmement puissantes dans OCaml, donc la lecture de la littérature OCaml pour obtenir des informations sur la façon de coder pour F # entraînera 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.

9
james woodyatt

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 des différences (je ne sais pas à quel point c'est à jour)

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

2
Lou Franco