Dans quels domaines L'utilisation de F# pourrait-elle être plus appropriée que C#? [fermé]

au cours des dernières années F# a évolué dans L'un des langages entièrement supportés de Microsoft employant de nombreuses idées incubées en OCaml, ML et Haskell.

au cours des dernières années, C# a élargi ses fonctions générales en introduisant de plus en plus de fonctions linguistiques: LINQ (compréhension de la liste), Lambdas, fermetures, délégués anonymes et plus encore...

compte tenu de L'adoption par C#de ces caractéristiques fonctionnelles et de la taxinomie de F#comme langage fonctionnel impur (il vous permet d'accéder aux bibliothèques de cadre ou de changer l'état partagé quand une fonction est appelée si vous le voulez) il y a une forte similitude entre les deux langues bien que chacune ait son propre accent primaire polar opposé.

je suis intéressé par tous les modèles réussis employant ces deux langues dans vos programmes polyglottes de production et aussi les secteurs dans les logiciels de production (applications web, applications client, applications serveur) que vous avez écrit en F# dans le l'année passée ou alors que vous auriez précédemment écrit en C#.

201
c# f#
demandé sur Peter McG 2010-05-07 02:45:10

11 réponses

j'ai écrit une demande pour équilibrer le calendrier national de production d'électricité pour un portefeuille de centrales à une position de négociation pour une société de l'énergie. Les composants client et serveur étaient en C# mais le moteur de calcul était écrit en F#.

l'utilisation de F# pour répondre à la complexité au cœur de cette application démontre clairement un point faible pour le langage au sein du logiciel d'entreprise, à savoir l'analyse algorithmique complexe de données de grande taille définir. Mon expérience a été très positive. En particulier:

Unités de mesure l'industrie dans laquelle je travaille est jonchée d'unités. Les équations que j'ai mises en œuvre (souvent de nature géométrique) portaient sur les unités de temps, de puissance et d'énergie. Avoir le système de type vérifier l'exactitude des unités des entrées et des sorties des fonctions est un gain de temps énorme, tant en termes de test et de lecture/compréhension du code. Il élimine toute une classe de des erreurs auxquelles les systèmes précédents étaient sujets.

programmation exploratoire travailler avec les fichiers de script et le REPL (F# Interactive) m'a permis d'explorer l'espace de solution plus efficacement avant de m'engager dans une implémentation que la boucle plus traditionnelle d'édition/compilation/exécution/test. C'est une façon très naturelle pour un programmeur de construire sa compréhension du problème et des tensions de conception en jeu.

Unité tester le Code écrit en utilisant des fonctions effectrices non-latérales et des structures de données immuables est un plaisir à tester. Il n'y a pas d'interactions complexes en fonction du temps pour tout faire foirer ou de grands ensembles de dépendances à se moquer.

Interopérabilité j'ai défini l'interface du moteur de calcul en C# et mis en œuvre le calcul de F#. Le moteur de calcul pourrait alors être injecté dans n'importe quel module C# qui devait l'utiliser sans aucun les préoccupations en matière d'interopérabilité. Heurt. Le programmeur C# ne doit jamais savoir.

réduction de Code la plupart des données introduites dans le moteur de calcul étaient sous forme de vecteurs et de matrices. Les fonctions d'ordre supérieur mangent ceux-ci pour le petit déjeuner avec un minimum d'agitation, un minimum de code. Beau.

manque de bogues la programmation fonctionnelle peut sembler étrange. Je peux travailler sur un algorithme, en essayant d'obtenir le code pour passer le vérificateur de type mais une fois que le vérificateur de type est satisfait thats it, il fonctionne. Ses presque binaire, soit il l'habitude de compiler ou de sa bonne. Les erreurs de cas de bord bizarres sont minimisées, les fonctions de récursion et d'ordre supérieur suppriment beaucoup de code de comptabilité qui introduit des erreurs de cas de bord.

parallélisme la pureté fonctionnelle de l'implémentation résultante le rend mûr pour exploiter le parallélisme inhérent dans le traitement des vecteurs de données. Peut-être que c'est ici que je vais aller maintenant que.

248
répondu simon cousins 2010-05-08 14:01:33

pendant mon stage chez Microsoft Research, j'ai travaillé sur certaines parties de Visual Studio IntelliSense pour F# (qui est lui-même écrit en F#). J'ai déjà eu une certaine expérience avec IntelliSense des projets C# précédents, donc je pense que je peux comparer les deux.

  • L'extensibilité de Visual Studio est toujours basée sur COM, donc vous avez besoin de traiter avec des objets qui ne sont pas très jolis. objets net (et certainement pas fonctionnelle), mais je ne sens pas qu'il y a grande différence entre C# et F# (il fonctionne en douceur de F#)

  • les structures de données utilisées pour représenter le code de programme en F# sont principalement syndicats discriminés (qui ne sont pas pris en charge en C# d'une manière raisonnable) et cela fait une énorme différence pour ce genre d'application (où vous devez traiter les structures d'arbre, comme le code de programme). Les syndicats discriminés et l'appariement des modèles vous permet de mieux structurer le code (garder les fonctionnalités connexes dans un seul endroit plutôt que de les avoir partout dans les méthodes virtuelles)

plus tôt, j'ai aussi travaillé sur CodeDOM provider for F# (aussi écrit en F#). J'ai d'abord fait des expériences en C#, puis j'ai converti le code en F#.

  • le fournisseur de CodeDOM doit traverser une structure représentée en utilisant des objets .NET, donc il n'y a pas beaucoup d'espace pour inventer vos propres représentations de données (qui est le domaine où F# peut offrir de beaux avantages).

  • cependant, il y avait beaucoup de petites caractéristiques de F# qui rendaient la tâche plus facile. Puisque vous avez besoin de produire une chaîne de caractères, j'ai défini des opérateurs personnalisés pour construire des chaînes (en utilisant StringBuilder ) et j'ai implémenté le code en les utilisant ainsi que des fonctions d'ordre supérieur (par exemple pour formater la liste des objets séparés en utilisant la chaîne spécifiée, etc.), ce qui a éliminé beaucoup de répétitions (et fastidieuses boucles foreach ).

il s'agit de deux exemples relativement spécifiques, mais tous deux sont liés au travail avec des représentations de programmes, ou des expressions, ou plus généralement, des structures complexes de données arborescentes. Je pense que dans ce domaine, F# est certainement un bon choix (indépendamment des caractéristiques fonctionnelles dans C#).

75
répondu Tomas Petricek 2010-05-06 23:08:13

nous avons expédié le premier produit commercial du Monde écrit en F# ( F# pour la visualisation ) et le second ( F# pour Numerics ) ainsi que la première littérature commerciale sur F# ( le F#.NET Journal ) et a écrit et publié le seul livre sur la version actuelle de F# ( Visual F# 2010 for Technical Computing ).

nous avions expédié des produits similaires écrit en C# (par exemple ce ) mais nous avions aussi une solide expérience dans l'utilisation commerciale de OCaml. Nous étions enthousiastes à l'idée D'adopter F# alors qu'il s'agissait encore d'un prototype de recherche en 2006, parce que nous avons reconnu le potentiel d'avoir un langage de type OCaml moderne et décent sur la plateforme industrielle .net et, par conséquent, nous avons insisté pour qu'il soit produit. Le résultat a été un incroyable succès et F# a largement dépassé nos attentes élevées.

Pour nous, F# a de nombreux avantages, et nous l'utilisons pour une grande variété d'applications. Nous avons des centaines de milliers de lignes de code F# en production. Nous utilisons maintenant F# pour tous de nos applications LOB: nos transactions par carte de crédit sont traitées en utilisant le code F#, nos notifications de produits sont envoyées en utilisant le code F#, nos abonnements sont traités en utilisant le code F#, nos comptes sont effectués en utilisant le code F# et ainsi de suite. Peut-être la principale caractéristique de langue qui paie des dividendes ici est correspondance des motifs. Nous avons même utilisé F# pour mettre en évidence la syntaxe de couleur de notre dernier livre...

notre bibliothèque de visualisation est un grand vendeur et sa fonctionnalité se centre sur F# interactive running in Visual Studio. Notre bibliothèque augmente cela avec la capacité de générer des visualisations 2D et 3D interactives avec un effort minimal (par exemple juste Plot([Function sin], (-6., 6.)) pour tracer une onde sinusoïdale). En particulier, toutes les questions de threading sont complètement automatisées de sorte que les utilisateurs n'ont pas à se soucier des threads et expédition. Les fonctions de première classe et la paresse ont été extrêmement précieux lors de l'écriture de cette partie de la bibliothèque et les types de données algébriques ont été largement utilisés ailleurs. Des performances prévisibles se sont également révélées précieuses lorsque nos clients ont eu des bugs de performance lors des hit testing de WPF et ont pu facilement réimposer le code correspondant en F# pour une amélioration de 10 000×. En raison de la forme libre de L'interface graphique de ce produit, le concepteur de L'interface graphique et C# n'aurait pas été bénéfique.

une grande partie de notre travail tourne autour des méthodes numériques, y compris nos bibliothèques commerciales et des livres. F# est beaucoup plus fort dans ce domaine que C# parce qu'il offre des abstractions de haut niveau (par exemple des fonctions d'ordre supérieur) avec des pénalités de performance minimales. Notre résultat le plus convaincant dans ce contexte a été la création d'une application simple mais généralisée de la décomposition QR à partir de l'algèbre linéaire qui était 20× plus courte que le code Fortran de la référence implémentation de LAPACK, jusqu'à 3 fois plus rapide que la bibliothèque de noyau Intel Math du fournisseur et plus générique parce que notre code peut gérer des matrices de tout type, même des matrices symboliques!

nous sommes en train de développer des composants WPF / Silverlight dans un mélange de F# (pour les boyaux) et C# (pour les shim), la construction d'applications WPF pour agir comme des manuels interactifs pour nos produits logiciels et je suis en train d'écrire un nouveau livre, Multicore F#, qui sera le guide définitif pour la mémoire partagée parallèle programmation activée .NET.

42
répondu Jon Harrop 2010-05-09 05:12:49

au cours des 6 derniers mois, J'ai travaillé sur une couche d'émulation Vim pour Visual Studio 2010. C'est un produit gratuit avec toutes les sources qu'il est disponible gratuitement sur github

le projet est divisé en 3 DLL représentant une couche distincte. Chaque couche a un test dll unitaire correspondant.

  1. Moteur Vim: F#
  2. WPF couche de ornements et de l'éditeur de l'intégration: C#
  3. Visual Studio Intégration de la couche: C#

C'est le premier grand projet que j'ai jamais fait avec F# et je dois dire que j'aime la langue. Dans beaucoup de façons, j'ai utilisé ce projet comme une méthode d'apprentissage F# (et cette courbe d'apprentissage est très évident si vous regardez dans les l'histoire du projet).

ce que je trouve le plus étonnant à propos de F# c'est à quel point il est concis d'un langage. Le moteur Vim constitue l'essentiel de la logique, mais il ne représente que 30% de la base de code globale.

24
répondu JaredPar 2010-05-07 00:42:37

de nombreux tests unitaires pour les composants F# Visual Studio sont écrits en F#. Ils tournent à L'extérieur de VS, se moquant des divers morceaux de Visual Studio. La possibilité de rassembler des objets anonymes qui implémentent des interfaces est utile à la place d'un framework/outil moqueur. Je peux juste écrire

let owpe : string list ref = ref []
let vsOutputWindowPane = 
    { new IVsOutputWindowPane with
        member this.Activate () = err(__LINE__)
        member this.Clear () = owpe := []; 0
        member this.FlushToTaskList () = VSConstants.S_OK
        member this.GetName(pbstrPaneName) = err(__LINE__)
        member this.Hide () = err(__LINE__)
        member this.OutputString(pszOutputString) = owpe := pszOutputString :: !owpe ; 0
        member this.OutputStringThreadSafe(pszOutputString) = owpe := pszOutputString :: !owpe ; 0
        member this.OutputTaskItemString(pszOutputString, nPriority, nCategory, pszSubcategory, nBitmap, pszFilename, nLineNum, pszTaskItemText) = err(__LINE__)
        member this.OutputTaskItemStringEx(pszOutputString, nPriority, nCategory, pszSubcategory, nBitmap, pszFilename, nLineNum, pszTaskItemText, pszLookupKwd) = err(__LINE__)
        member this.SetName(pszPaneName) = err(__LINE__)
    }            
DoSomethingThatNeedsA(vsOutputWindowPane)
assert( !owpe = expectedOutputStringList )

quand j'ai besoin d'un exemple de IVsOutputWindowPane pour passer à un autre composant qui appellera éventuellement OutputString et Clear , et puis inspecter le string list ref objet à la fin du test pour voir si la sortie attendue a été écrite.

13
répondu Brian 2010-05-06 23:23:02

nous avons écrit un langage de moteur de règles personnalisé en utilisant L'implémentation Lex-yacc en F#

Modifier pour inclure une réponse de commentaire

Il n'y a pas de lex/yacc mise en œuvre en C#. (pour autant que nous le sachions, et le F# one était)

il aurait été possible, mais une douleur pure et simple de construire l'analyse nous-mêmes.

Ce sujet montre quelques autres suggestions, comme les bibliothèques externes, mais notre architecte principal est un vieil homme aux langues fonctionnelles, de sorte que le choix d'utiliser F# était un no-brainer.

9
répondu johnc 2017-05-23 12:26:21

je travaille actuellement sur une compilation pour un langage de programmation. Le compilateur est entièrement écrit en F#. Le compilateur (en dehors de la construction lex et parser avec lex / yacc) est essentiellement construit comme beaucoup de transformation d'un arbre complexe comme la structure.

comme d'autres l'ont fait remarquer, la discrimination des syndicats et l'appariement des modèles rendent le travail avec ce genre de structure de données beaucoup plus facile que le dumping du code dans des méthodes virtuelles "all over the place"

Je n'avais pas fait de F# travail avant de commencer à travailler sur le compilateur (j'avais cependant des compilateurs buld dans une autre variante OCaml appelée MoscowML) et tout comme Jared déclare qu'il est visible à partir du code ce que les parties que j'ai fait en premier mais en général, j'ai trouvé F# facile d'apprendre à entrer dans L'esprit FP mis à nouveau après le codage principalement OO pour une décennie prendra un peu plus longtemps cependant.

travailler avec des arbres de côté je trouve la possibilité d'écrire du code déclaratif le principal avantage de la FP (F# inclus) ayant code qui décrit L'algorithme Im essayant de mettre en œuvre contrairement à C# décrivant comment j'ai mis en œuvre l'algortihm est un avantage énorme.

7
répondu Rune FS 2010-05-07 08:13:02

pas d'expérience personnelle, mais vous pouvez écouter un épisode de DNR (je pense que c'est celui-ci ) où ils parlent à Microsoft folk de F#. Ils ont écrit la plupart du système de notation Xbox Live, qui était loin d'être trivial, en utilisant F#. Le système s'étale massivement sur des centaines de machines et ils en sont très satisfaits.

6
répondu Igor Zevaka 2010-05-06 22:49:51

le WebSharper les gens ont construit un produit entier qui est centré sur F# pour la programmation web. Voici un article qui en parle:

http://www.sdtimes.com/content/article.aspx?ArticleID=34075

6
répondu Brian 2010-05-06 23:35:31

Voici une étude de cas sur une banque qui utilise F # avec C++ / COM pour des trucs:

http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000006794

6
répondu Brian 2010-05-06 23:39:21

Je ne sais pas s'il est en production, mais L'AI pour "The Path of Go" a été écrit en F#:

http://research.microsoft.com/en-us/events/techvista2010/demolist.aspx#ThePathofGo

le chemin de Go: une recherche de Microsoft Jeu pour Xbox 360

cette démo présente un jeu Xbox 360, basé sur le jeu de Go, produit à L'interne chez Microsoft Research Cambridge. Go est un de plus jeux de société célèbres en Asie de l'est, il originaire de Chine il y a 4000 ans. Derrière la simplicité trompeuse de la jeu cache une grande complexité. Il ne faut que quelques minutes pour apprendre, mais il faut un vie pour le maîtriser. Bien que les ordinateurs ont surpassé les compétences humaines aux échecs, mise en œuvre d'une AI compétitive pour Go reste un défi de recherche. Jeu est alimenté par trois technologies développé par Microsoft Research Cambridge: une IA capable de jouer Go, the F# de la langue, et TrueSkill™ match, les joueurs en ligne. L'IA est mise en œuvre en f# défi de courir efficacement dans le .net compact framework sur Xbox 360. Ce jeu vous place dans un certain nombre de scènes 3D visuellement étonnantes. Il a été entièrement développé en code géré en utilisant l'environnement XNA.

(Quelqu'un d'autre a déjà mentionné" TrueSkill".)

5
répondu Brian 2010-05-06 23:31:34