F # change pour OCaml

F # est dérivé d’OCaml, mais quels éléments majeurs sont manquants ou ajoutés? Plus précisément, je suis curieux de savoir si les ressources disponibles pour l’apprentissage d’OCaml sont également utiles à quelqu’un qui veut apprendre le F #.

    Les principales différences sont que F # ne supporte pas:

    • 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 parameters é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).

    Cette question a été répondue depuis un certain temps, mais j’ai été très surpris que la plupart des réponses indiquent quelles fonctionnalités OCaml sont manquantes dans F # – c’est vraiment bon à savoir si vous voulez porter des programmes OCaml existants sur F # 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 ajoutés dans F #:

    • Unités de mesure qui vous permettent de taper le code traitant des calculs numériques
    • La méta-programmation utilisant des citations (ce qui permet d’utiliser LINQ dans F # et est également essentiel pour les projets prometteurs comme la plateforme WebSharper)
    • Motifs actifs pour la création d’abstractions pour les types de données fonctionnels (et fonctionnalité très utile pour les applications de correspondance de modèles plus compliquées)
    • Expressions de calcul qui sont une fonctionnalité de langage derrière les workflows asynchrones (une bibliothèque pour les E / S asynchrones / la programmation Web / l’interface utilisateur graphique)
    • Système-object compatible .NET qui permet une interopérabilité totale avec la plate-forme .NET (OCaml a également un support pour les objects mais différent – il y a bien sûr quelques avantages dans les deux systèmes).
    • Opérateurs surchargés – Pour autant que je sache, OCaml n’a pas des opérateurs surchargés – en F #, vous pouvez utiliser + pour tous les types numériques ainsi que vos types qui le supportent.

    Et, honnêtement, je pense que cela vaut également la peine de mentionner l’IDE de Visual Studio. Ce n’est pas une partie du langage, mais cela améliore vraiment l’expérience utilisateur (le support d’IntelliSense dans Visual Studio est vraiment bon!)

    Si vous regardez la liste, il y a beaucoup de choses qui ont largement consortingbué à la popularité de F #, donc c’est beaucoup plus que juste “OCaml sans functors”. F # est clairement 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 les processus asynchrones, les OO de style .NET et la méta-programmation, la Microsoft Developer Division n’inclurait jamais F # dans Visual Studio 2010.

    Je décris toujours F # comme un cousin d’OCaml, car OCaml possède de nombreuses fonctionnalités que F # ne possède pas et qu’il n’est jamais susceptible d’obtenir. F # est plus étroitement lié au précédent langage CAML. En particulier, F # a un support très limité pour l’abstraction et aucun support pour le typage structurel (comme les objects et les variantes polymorphes d’ OCaml).

    Contrairement à ce que certains répondants ont écrit, F # prend en charge (de manière limitée) les arguments étiquetés (“nommés”) et facultatifs.

    Cependant, ce sont toutes des fonctionnalités avancées et vous pouvez certainement commencer à comprendre les idées de base de la functional programming de style OCaml à petite échelle en utilisant des ressources sur OCaml. La première différence majeure que vous découvrirez est celle des problèmes à grande échelle, tels que 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 à faire cela dans 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 les types (tels que les structures de données), mais les alternatives à la POO sont non seulement hideuses mais presque entièrement inutilisées sur .NET. De plus, lorsque j’essaie d’écrire des structures de données paramétrées avec élégance, j’ai heurté des dizaines de bogues dans le compilateur F # car personne n’a même tenté de le faire auparavant. Le stdlib F # contient de belles implémentations de structure de données, mais pratiquement pas de réutilisation, c’est-à-dire qu’il s’agit d’un travail de cut’n’paste.

    F # et OCaml sont des classes taxonimiques dans la famille de langages ML, qui inclut également tout un éventail 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’objects et variantes polymorphes]. À eux deux, ces deux simplifications facilitent probablement l’apprentissage de la plate-forme .Net. Malheureusement, ces deux fonctionnalités de langage sont extrêmement puissantes dans OCaml, donc lire la documentation OCaml pour mieux comprendre comment coder pour F # entraînera probablement une frustration prématurée avec cette dernière, alors qu’elle constitue une excellente alternative à C # lorsque les deux sont disponibles.

    F # supporte directement 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 (vous ne savez pas si c’est à jour)

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