F # change en OCaml [fermé]

126

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

Erik Forbes
la source
3
Une autre comparaison du point de vue d'un développeur OCaml donc c'est assez biaisé mais néanmoins utile.
Mauricio Scheffer
8
Attention: si le sort de cette question vous intéresse, rejoignez la discussion sur Meta Stack Overflow ou discutez-en dans le chat - les commentaires ici étaient extrêmement improductifs, je les ai donc supprimés.
Shog9
1
@MauricioScheffer Lien brisé!
JD
2
@JonHarrop Je pense que ce lien pourrait être celui mis à jour. (Par Keiko Nakata)
Bart

Réponses:

89

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

Chris Conway
la source
3
Existe-t-il un équivalent camlp4 pour F #?
nlucaroni
Ne pense pas. Mais vous pouvez diriger votre programme via camlp4 et dans le compilateur F #, probablement. (Je ne le recommanderais pas.)
Chris Conway
6
F # a des arguments nommés et optionnels mais il utilise une syntaxe et une sémantique différentes. Vous aurez du mal à utiliser Camlp4 avec F # car F # est presque toujours sensible à l'indentation, il aura donc besoin d'un nouveau lexer et la documentation de Camlp4 sur les lexers est restée non écrite pendant près de deux ans.
JD
4
Et maintenant, le lien est mort. Je suppose que c'est probablement bon. Je suis sûr que F # a été amélioré depuis '08.
1
J'ai entendu quelque part que Microsoft ne voulait pas ajouter des fonctionnalités de type camlp4 à F # car ils craignaient qu'une telle fonctionnalité n'encourage les gens à commencer à utiliser des environnements de développement autres que Microsoft Visual Studio.
chrismamo1
118

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 #:

  • Unités de mesure qui vous permettent de saisir le code de contrôle traitant des calculs numériques
  • Méta-programmation à l' aide de citations (qui permet d'utiliser LINQ en F # et est également indispensable pour les projets prometteurs comme la plateforme 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 complexes)
  • Expressions de calcul qui est une fonctionnalité de langage derrière les flux de travail asynchrones (une bibliothèque pour les E / S asynchrones / service Web / programmation GUI)
  • Système objet compatible .NET qui permet une interopérabilité totale avec la plate-forme .NET (OCaml a également un support pour les objets mais différent - il y a bien sûr des avantages dans les deux systèmes).
  • Opérateurs surchargés - 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 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.

Tomas Petricek
la source
18
Woah! OCaml a été spécialement conçu pour la métaprogrammation, il est largement supérieur à F # et .NET dans ce contexte. Camlp4 est un système de cotation bien plus puissant que celui de F #. Les lexers et les analyseurs d'OCaml sont bien meilleurs que tout ce qui est disponible pour .NET. De plus, des macros Camlp4 sont disponibles qui implémentent des modèles actifs et des expressions de calcul. OCaml possède également des IDE qui offrent les mêmes avantages que Visual Studio pour F #.
JD
4
Les citations F # ont un objectif complètement différent de ce qui est disponible dans Camlp4 (mis à part, ce n'est pas un langage OCaml - c'est un système en plus), il n'est donc pas juste de les comparer. L'existence de Camlp4 est certainement un avantage d'OCaml, mais cela n'a rien à voir avec les citations (qui permettent des choses comme WebSharper, exécuter F # sur GPU, etc.)
Tomas Petricek
12
@Tomas: Comment conciliez-vous votre affirmation selon laquelle Camlp4 "est un système au-dessus de" OCaml lorsque Camlp4 est intégré à OCaml au niveau binaire et que les macros Camlp4 peuvent être définies et utilisées à la volée dans un OCaml REPL en cours d'exécution? Comment conciliez-vous votre affirmation selon laquelle Camlp4 "n'a rien à voir avec les citations" avec le fait que Camlp4 fournit un mécanisme de cotation? Comment conciliez-vous votre implication que Camlp4 ne peut pas faciliter les goûts de Websharper alors que l'outil ocamljs de SkyDeck compile du code OCaml cité en utilisant Camlp4 en Javascript depuis 2007?
JD
6
@Tomas: F # ne peut même pas citer les expressions avec des variables indépendantes comme <@ 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!
JD
8
@Erik: "La plupart des gens se concentrent sur ce qui manque dans F #, mais je voulais aussi voir ce qui manquait à OCaml". Notez que les modèles actifs, la métaprogrammation, les expressions de calcul et les workflows asynchrones étaient disponibles dans OCaml avant qu'ils ne deviennent F #.
JD
16

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.

JD
la source
28
Tous les liens nécessitent des abonnements payants.
2
@Est-ce qu'ils semblent être un plug-in sans vergogne pour les choses que Jon Harrop a écrites lui-même (il est répertorié comme l'auteur à chaque fois)
symbiont
@symbiont Ouais, nous savons que c'est un peu spammé. Ce serait bien si vous vous connectiez à des informations supplémentaires gratuites. Mais la réponse est bonne sans les liens, alors vous y êtes.
@Will serait bien si vous liez vous
symbiont
@symbiont Je voulais dire jon, pas toi, quand j'ai dit "toi". Cela semble bizarre, le lire. Je ne sais pas si Jon a supprimé un commentaire interstitiel. Quoi qu'il en soit, vous y allez: Meta Stack Exchange
9

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.

James Woodyatt
la source
2

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

Lou Franco
la source
1
"F # supporte directement la syntaxe OCaml. Ce n'est peut-être pas 100% compatible, mais je pense que c'est assez proche". La prise en charge par IME du compilateur F # de la compatibilité OCaml est très boguée. Cela peut rendre difficile le portage des bases de code OCaml existantes vers F # car le compilateur F # meurt en interne sur du code valide.
JD
Tous les liens sont morts.
Wingjam