135 votes

Quelles sont les principales différences entre Haskell et F #?

J’ai cherché sur Internet pour les comparaisons entre F # et Haskell mais n’avez pas trouvé quoi que ce soit vraiment définitif. Quelles sont les principales différences et pourquoi est-ce que je veux choisir l’un plutôt que l’autre ?

126voto

Xian Points 33986

Haskell est un "pur" langage fonctionnel, où F# a des aspects à la fois impératif/OO et les langages fonctionnels. Haskell a également évaluation différée, ce qui est assez rare parmi les langages fonctionnels.

Qu'est ce que ces choses signifient? Un langage purement fonctionnel, il n'y a pas d'effets secondaires (ou des changements dans l'état partagé, quand une fonction est appelée, ce qui signifie que vous garantis que si vous appelez f(x), rien ne se passe d'ailleurs de retourner une valeur de la fonction, comme la sortie de la console, de la base de données de sortie, les changements de variables globales ou statiques.. et bien que Haskell peut avoir des fonctions pures (par le biais de monades), il doit être explicitement' implicite par la déclaration.

Pure langages fonctionnels et " Aucun effet secondaire de la programmation a gagné en popularité récemment qu'il se prête bien à multi core simultanéité, car il est beaucoup plus difficile de se tromper avec aucun état partagé, plutôt que d'une myriade de serrures et les sémaphores.

L'évaluation différée est lorsqu'une fonction n'est PAS évalué jusqu'à ce qu'il est absolument nécessaire requis. ce qui signifie que beaucoup d'opération peut être évitée lorsqu'il n'est pas nécessaire. Pensez à cela dans une base de C# si la clause comme ceci:

if(IsSomethingTrue() && AnotherThingTrue())
{
    do something;
}

Si IsSomethingTrue() est fausse, alors AnotherThingTrue() méthode n'est jamais évaluée.

Tout en Haskell est un étonnant langue, l'avantage majeur de F# (pour le moment), c'est qu'il se trouve sur le dessus de la CLR. Cela se prête à polyglotte de la programmation. Un jour, vous pouvez écrire votre INTERFACE utilisateur web dans ASP.net MVC, votre logique métier en C#, votre algorithmes de base en F#, et des tests unitaires dans Ironruby.... Tous les parmi les de la .Net framework.

Écouter le Logiciel d'Ingénierie radio avec Simon Peyton Jones pour plus d'info sur Haskell: Épisode 108: Simon Peyton Jones sur la Programmation Fonctionnelle et Haskell

52voto

Nathan Sanders Points 10641

De grandes différences:

  • Plate-forme
  • L'orientation de l'objet
  • La paresse

Les similitudes sont plus importantes que les différences. Fondamentalement, vous devez utiliser F# si vous êtes sur .NET déjà, Haskell autrement. Aussi, OO et de la paresse dire que F# est plus proche de ce que vous (probablement) le savent déjà, alors il est probablement plus facile à apprendre.

Plate-forme : Haskell a sa propre exécution, F# utilise .NET. Je ne sais pas ce que la différence de performance est, bien que je soupçonne que la moyenne de code est sur la même avant d'optimisation. F# a l'avantage si vous avez besoin de la .Bibliothèques NET.

L'orientation de l'objet : F# a OO, et est très attentif à faire en sorte que .NET les classes sont faciles à utiliser, même si votre code n'est pas OO. Haskell a des classes de type qui vous permettent de faire quelque chose comme OO, dans une étrange sorte de façon. Ils sont comme des Rubis mixin croisé avec Common Lisp fonctions génériques. Ils sont un peu comme Java/C# interfaces.

La paresse : Haskell est paresseux, F# n'est pas. La paresse permet quelques astuces intéressantes et rend certaines choses qui semblent ralentir l'exécution rapide. Mais je trouve qu'il est beaucoup plus difficile à deviner à quelle vitesse mon code sera exécuté. Les deux langues vous permettent d'utiliser l'autre modèle, vous avez juste à être explicite à ce sujet dans votre code.

Des différences mineures:

  • Syntaxe : Haskell a un peu plus sympa syntaxe, à mon avis. C'est un peu plus laconique et régulier, et j'ai, comme la déclaration de types sur une ligne distincte. YMMV.
  • Outils : F# a une excellente intégration à Visual Studio, si vous aimez ce genre de chose. Haskell a aussi un plus vieux Visual Studio plugin, mais je ne pense pas qu'il sortait de la bêta. Haskell est un simple mode emacs, et vous pouvez probablement utiliser OCaml tuareg-mode éditer F#.
  • Effets secondaires : les Deux langues en faire assez évident quand vous êtes la mutation de variables. Mais Haskell compilateur vous force à marquer des effets secondaires à chaque fois que vous les utilisez. En pratique, la différence est que vous devez être beaucoup plus conscient de lorsque vous utilisez des bibliothèques avec des effets secondaires ainsi.

37voto

Mark Cidade Points 53945

F # fait partie de la famille ML des langues et est très proche de OCaml. Vous pouvez lire cette discussion sur les différences entre Haskell et OCaml.

32voto

Curt Sampson Points 10866

Une différence majeure, ce qui est probablement une conséquence de la pureté, mais j'ai moins de voir mentionné, est l'utilisation généralisée des monades. Comme c'est souvent souligné, les monades peuvent être construits dans la plupart n'importe quelle langue, mais la vie change beaucoup quand ils sont utilisés de façon omniprésente tout au long de l'bibliothèques, et que vous utilisez vous-même.

Les monades fournir quelque chose qu'on voit beaucoup plus limitée dans les autres langues: l'abstraction de contrôle de flux. Ils sont incroyablement utile et élégant façons de faire toutes sortes de choses, et une année de Haskell a complètement changé la façon dont je programme, de la même manière que le passage de l'impératif à la programmation orientée-objet il y a plusieurs années a changé, ou, beaucoup plus tard, à l'aide de fonctions d'ordre supérieur n'.

Malheureusement, il n'y a aucun moyen dans un espace de ce genre pour fournir assez de compréhension pour vous permettre de voir quelle est la différence. En fait, aucun montant de l'écriture va le faire; vous n'avez qu'à passer assez de temps à l'apprentissage et à l'écriture de code pour acquérir une véritable compréhension.

Ainsi, F#, parfois peut-être légèrement moins fonctionnel ou plus maladroit (à partir de la programmation fonctionnelle, point de vue) lorsque vous interface avec le .NET plate-forme/bibliothèques, les bibliothèques ont été évidemment conçu à partir d'un OO point de vue.

Ainsi, vous pourriez envisager de votre décision de cette façon: vous êtes à la recherche d'essayer un de ces langues afin d'obtenir un rapide, relativement petit incrément d'amélioration, ou êtes-vous prêts à mettre plus de temps et d'obtenir moins de bénéfice immédiat pour quelque chose de plus grand dans le long terme. (Ou, au moins, si vous n'obtenez pas quelque chose de plus grand, la facilité de passer d'un à l'autre rapidement?) Dans le premier cas, F# est votre choix, si ce dernier, Haskell.

Un couple de d'autres sans rapport avec les points:

Haskell est un peu plus sympa de la syntaxe, qui n'est pas surprenant, puisque les créateurs de Haskell savait ML très bien. Cependant, F#'s 'lumière' la syntaxe va un long chemin vers l'amélioration de ML de syntaxe, donc il n'y a pas un écart énorme.

En termes de plates-formes, F# est bien sûr .NET; comment ça va fonctionner sur Mono, je ne sais pas. GHC compilé en code machine avec sa propre exécution, fonctionne bien à la fois sous Windows et Unix, qui se compare à la .NET de la même manière, que, disons, C++. Cela peut être un avantage dans certaines circonstances, en particulier en termes de vitesse et de niveau inférieur accès à la machine. (Je n'ai eu aucun problème d'écriture d'un serveur DDE en Haskell/GHC, par exemple; je ne pense pas que vous pourriez le faire en toute .NET de la langue, et indépendamment, MS ne veut certainement pas que tu fais ça.)

4voto

iDevlop Points 9770

Je sais que la question est sérieusement vieux, mais j’ai trouvé cette comparaison intéressante :
http://hammerprinciple.com/therighttool/items/f/haskell

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X