Ich habe einen Antrag geschrieben, um den nationalen Stromerzeugungsplan für ein Portfolio von Kraftwerken auf eine Handelsposition für ein Energieunternehmen abzustimmen. Die Client- und Serverkomponenten befanden sich in C #, aber die Berechnungsmaschine wurde in F # geschrieben.
Die Verwendung von F # zur Bewältigung der Komplexität im Herzen dieser Anwendung zeigt deutlich einen Sweet Spot für die Sprache in Unternehmenssoftware, nämlich die algorithmisch komplexe Analyse großer Datenmengen. Meine Erfahrung war sehr positiv. Bestimmtes:
Maßeinheiten Die Branche, in der ich arbeite, ist mit Einheiten übersät. Die von mir implementierten Gleichungen (oft geometrischer Natur) befassten sich mit Zeit-, Kraft- und Energieeinheiten. Es ist eine enorme Zeitersparnis, wenn das Typsystem die Richtigkeit der Einheiten der Ein- und Ausgänge von Funktionen überprüft, sowohl beim Testen als auch beim Lesen / Verstehen des Codes. Es beseitigt eine ganze Klasse von Fehlern, für die frühere Systeme anfällig waren.
Explorative Programmierung Durch die Arbeit mit Skriptdateien und REPL (F # Interactive) konnte ich den Lösungsbereich effektiver erkunden, bevor ich mich zu einer Implementierung entschied, als mit der herkömmlichen Schleife zum Bearbeiten / Kompilieren / Ausführen / Testen. Es ist eine sehr natürliche Möglichkeit für einen Programmierer, sein Verständnis für das Problem und die Spielspannungen im Spiel zu entwickeln.
Unit-Test Code, der mit nicht nebenwirkenden Funktionen und unveränderlichen Datenstrukturen geschrieben wurde, ist eine Freude zu testen. Es gibt keine komplexen zeitabhängigen Interaktionen, um Dinge zu vermasseln, oder große Mengen von Abhängigkeiten, die verspottet werden müssen.
Interoperation Ich habe die Schnittstelle zur Berechnungsmaschine in C # definiert und die Berechnung in F # implementiert. Die Berechnungs-Engine könnte dann in jedes C # -Modul eingefügt werden, das sie verwenden muss, ohne dass Bedenken hinsichtlich der Interoperabilität bestehen. Nahtlos. Der C # -Programmierer muss es nie wissen.
Code-Reduktion Ein Großteil der in die Berechnungsmaschine eingegebenen Daten lag in Form von Vektoren und Matrizen vor. Funktionen höherer Ordnung essen diese zum Frühstück mit minimalem Aufwand und minimalem Code. Wunderschönen.
Fehlende Fehler Die funktionale Programmierung kann sich seltsam anfühlen. Ich kann an einem Algorithmus arbeiten und mich bemühen, den Code dazu zu bringen, die Typprüfung zu bestehen, aber sobald die Typprüfung zufrieden ist, funktioniert es. Es ist fast binär, entweder wird es nicht kompiliert oder es ist korrekt. Seltsame Randfallfehler werden minimiert, Rekursion und Funktionen höherer Ordnung entfernen viel Buchhaltungscode, der Randfallfehler einführt.
Parallelität Die funktionale Reinheit der resultierenden Implementierung macht es reif, die inhärente Parallelität bei der Verarbeitung von Datenvektoren auszunutzen. Vielleicht gehe ich jetzt als nächstes dorthin, wo .NET 4 herauskommt.
Während meines Praktikums bei Microsoft Research habe ich an einigen Teilen von Visual Studio IntelliSense für F # gearbeitet (das selbst in F # geschrieben ist). Ich hatte bereits einige Erfahrungen mit IntelliSense aus früheren C # -Projekten, daher denke ich, dass ich die beiden vergleichen kann.
Visual Studio Extensibility basiert immer noch auf COM, daher müssen Sie sich mit Objekten befassen, die keine sehr schönen .NET-Objekte sind (und definitiv nicht funktionieren), aber ich glaube nicht, dass es einen wesentlichen Unterschied zwischen C # und F # gibt (es funktioniert reibungslos von F #)
Die Datenstrukturen, die zur Darstellung von Programmcode in F # verwendet werden, sind meist diskriminierte Gewerkschaften (die in C # in keiner vernünftigen Weise unterstützt werden). Dies macht einen großen Unterschied für diese Art von Anwendung (bei der Sie Baumstrukturen wie Programmcode verarbeiten müssen) ). Durch diskriminierte Gewerkschaften und Mustervergleiche können Sie den Code besser strukturieren (verwandte Funktionen an einem Ort aufbewahren, anstatt sie in virtuellen Methoden überall zu haben).
Zuvor habe ich auch am CodeDOM-Anbieter für F # gearbeitet (auch in F # geschrieben). Ich habe tatsächlich zuerst in C # experimentiert, dann aber den Code in F # konvertiert.
Der CodeDOM-Anbieter muss eine Struktur durchlaufen, die mit .NET-Objekten dargestellt wird, sodass nicht viel Platz zum Erfinden eigener Darstellungen von Daten vorhanden ist (in diesem Bereich kann F # nützliche Vorteile bieten).
Es gab jedoch viele kleine F # -Funktionen, die die Aufgabe erleichterten. Da Sie eine Zeichenfolge erstellen müssen, habe ich benutzerdefinierte Operatoren zum Erstellen von Zeichenfolgen (mithilfe
StringBuilder
) definiert und den Code mithilfe dieser und Funktionen höherer Ordnung (z. B. zum Formatieren einer Liste von Objekten, die durch die angegebene Zeichenfolge getrennt wurden usw.) implementiert, wodurch viele entfernt wurden Wiederholung (und langwierigeforeach
Schleifen).Dies sind zwei relativ spezifische Beispiele, aber beide beziehen sich auf die Arbeit mit Darstellungen von Programmen oder Ausdrücken oder allgemeiner auf komplexe baumartige Datenstrukturen. Ich denke, dass in diesem Bereich F # definitiv eine gute Wahl ist (unabhängig von den Funktionsmerkmalen in C #).
quelle
Wir haben das weltweit erste kommerzielle Produkt in F # ( F # für Visualisierung ) und das zweite ( F # für Numerik ) sowie die erste kommerzielle Literatur zu F # ( The F # .NET Journal ) ausgeliefert und das einzige Buch über die aktuelle Version geschrieben und veröffentlicht von F # ( Visual F # 2010 für Technical Computing ).
Wir hatten Produkte in ähnlicher Weise versendet, die in C # geschrieben waren (z. B. dieses ), aber wir hatten auch einen starken Hintergrund in der kommerziellen Verwendung von OCaml. Wir waren begeisterte Erstanwender von F #, als es 2006 noch ein Forschungsprototyp war, weil wir das Potenzial einer anständigen modernen OCaml-ähnlichen Sprache auf der industrietauglichen .NET-Plattform erkannten und uns daher für eine Produktproduktion einsetzten. Das Ergebnis war ein unglaublicher Erfolg und F # hat unsere hohen Erwartungen weit übertroffen.
Für uns hat F # viele verschiedene Vorteile und wir verwenden es für eine Vielzahl von Anwendungen. Wir haben Hunderttausende von Zeilen F # -Code in der Produktion. Wir verwenden jetzt F # für alle unsere LOB-Apps: Unsere Kreditkartentransaktionen werden mit F # -Code verarbeitet, unsere Produktbenachrichtigungen werden mit F # -Code gesendet, unsere Abonnements werden mit F # -Code abgewickelt, unsere Konten werden mit F # -Code erstellt und so weiter. Vielleicht ist das wichtigste Sprachmerkmal, das sich hier auszahlt, der Mustervergleich. Wir haben sogar F # verwendet, um die Farbsyntax unseres neuesten Buches hervorzuheben ...
Unsere Visualisierungsbibliothek ist ein Verkaufsschlager und ihre Funktionalität konzentriert sich auf die interaktive Ausführung von F # in Visual Studio. Unsere Bibliothek erweitert dies um die Möglichkeit, interaktive 2D- und 3D-Visualisierungen mit minimalem Aufwand (z. B. nur) zu erstellen
Plot([Function sin], (-6., 6.))
eine Sinuswelle zeichnen). Insbesondere sind alle Threading-Probleme vollständig automatisiert, sodass sich Benutzer nicht um UI-Threads und den Versand kümmern müssen. Erstklassige Funktionen und Faulheit waren beim Schreiben dieses Teils der Bibliothek äußerst wertvoll, und algebraische Datentypen wurden an anderer Stelle ausgiebig verwendet. Die vorhersehbare Leistung erwies sich auch hier als wertvoll, als unsere Kunden bei den WPF-Treffertests auf Leistungsfehler stießen und den relevanten Code in F # problemlos erneut implementieren konnten, um eine 10.000-fache Leistungsverbesserung zu erzielen. Aufgrund der Freiform der Benutzeroberfläche dieses Produkts wären der GUI-Designer und C # nicht vorteilhaft gewesen.Ein Großteil unserer Arbeit dreht sich um numerische Methoden, einschließlich unserer kommerziellen Bibliotheken und Bücher. F # ist in diesem Bereich viel stärker als C #, da es Abstraktionen auf hoher Ebene (z. B. Funktionen höherer Ordnung) mit minimalen Leistungseinbußen bietet. Unser überzeugendstes Ergebnis in diesem Zusammenhang war die Erstellung einer einfachen, aber verallgemeinerten Implementierung der QR-Zerlegung aus der linearen Algebra, die 20-mal kürzer als der Fortran-Code aus der Referenzimplementierung von LAPACK war und bis zu 3-mal schneller als die vom Hersteller optimierte Intel Math Kernel Library und allgemeiner, weil unser Code Matrizen aller Art verarbeiten kann, sogar symbolische Matrizen!
Wir entwickeln derzeit WPF / Silverlight-Komponenten in einer Mischung aus F # (für den Mut) und C # (für die Unterlegscheibe), erstellen WPF-Apps, die als interaktive Handbücher für unsere Softwareprodukte dienen, und ich schreibe ein neues Buch, Multicore F # wird der endgültige Leitfaden für die parallele Programmierung mit gemeinsamem Speicher unter .NET sein.
quelle
In den letzten 6 Monaten habe ich an einer Vim-Emulationsebene für Visual Studio 2010 gearbeitet. Es ist ein kostenloses Produkt mit allen Quellen, die auf Github frei verfügbar sind
Das Projekt ist in 3 DLLs unterteilt, die eine bestimmte Ebene darstellen. Jede Schicht hat eine entsprechende Unit-Test-DLL.
Dies ist das erste große Projekt, das ich jemals mit F # gemacht habe und ich muss sagen, dass ich die Sprache liebe. In vielerlei Hinsicht habe ich dieses Projekt als Methode zum Lernen von F # verwendet (und diese Lernkurve ist sehr offensichtlich, wenn Sie sich die Geschichte des Projekts ansehen).
Was ich an F # am erstaunlichsten finde, ist, wie prägnant eine Sprache ist. Die Vim-Engine macht den Großteil der Logik aus, macht jedoch nur 30% der gesamten Codebasis aus.
quelle
()
in F # nicht - der,
Operator erstellt sie, alsolet x = 1,2
ist ein gültiges Tupel bereits ohne Parens. Zweitens können alle Paar-Parens in F # durch Paare vonbegin
.. ersetzt werdenend
(dies wird von ML geerbt) - dies ist beispielsweise"foo".IndexOf begin 'a', 1 end
ein gültiger .NET-Methodenaufruf. Also, wenn Sie jemals parensfrei sein wollten, ist F # eine Sprache, die es Ihnen ermöglicht, genau das zu tun :)begin
..end
. AUCH: VsVim REGELN!Viele der Komponententests für die F # Visual Studio-Komponenten sind in F # geschrieben. Sie laufen außerhalb von VS und verspotten die verschiedenen Visual Studio-Bits. Die Möglichkeit, anonyme Objekte zu konsultieren, die Schnittstellen implementieren, ist anstelle eines spöttischen Frameworks / Tools nützlich. Ich kann einfach schreiben
wenn ich brauche eine Instanz eines von zB
IVsOutputWindowPane
zu einer anderen Komponente zu übergeben , die schließlich Aufruf werdenOutputString
undClear
und dann das Einsichtstring list ref
am Ende des Testobjekts zu sehen , ob die erwartete Ausgabe geschrieben wurde.quelle
Wir haben eine benutzerdefinierte Regelengine mit der Lex-Yacc-Implementierung in F # geschrieben
BEARBEITEN, um eine Kommentarantwort einzuschließen
Es gab keine Lex / Yacc-Implementierung in C #. (Soweit uns bekannt war und die F # eins war)
Es wäre möglich gewesen, aber ein regelrechter Schmerz, das Parsen selbst aufzubauen.
Dieses Thema zeigt einige andere Vorschläge, wie z. B. externe Bibliotheken, aber unser leitender Architekt ist ein alter Hase in funktionalen Sprachen, sodass die Wahl von F # ein Kinderspiel war.
quelle
Ich arbeite derzeit an einer Kompilierung für eine Programmiersprache. Der Compiler ist vollständig in F # geschrieben. Der Compiler (abgesehen vom Lex- und Parser-Build mit lex / yacc) wird im Grunde genommen als viel Transformation einer komplexen baumartigen Struktur erstellt.
Wie von anderen festgestellt, diskriminieren Gewerkschaften und Mustervergleich macht das Arbeiten mit dieser Art von Datenstruktur viel einfacher, als den Code in virtuellen Methoden "überall" abzulegen.
Ich hatte keine F # -Arbeit erledigt, bevor ich anfing, am Compiler zu arbeiten (ich hatte jedoch Compiler in einer anderen OCaml-Variante namens MoscowML), und genau wie Jared angibt, ist aus dem Code ersichtlich, welche Teile ich zuerst gemacht habe, aber im Allgemeinen fand ich F # einfach Es wird allerdings etwas länger dauern, bis man wieder in die FP-Denkweise eintaucht, nachdem man ein Jahrzehnt lang hauptsächlich OO codiert hat.
Abgesehen von der Arbeit mit Bäumen finde ich die Fähigkeit, deklarativen Code zu schreiben, der Hauptvorteil von FP (einschließlich F #) mit Code, der den Algorithmus beschreibt. Ich versuche zu implementieren, im Gegensatz zu C #, das beschreibt, wie ich den Algorithmus implementiert habe, ist ein großer Vorteil.
quelle
Keine persönliche Erfahrung, aber Sie können sich eine Folge von DNR anhören (ich denke, es ist diese ), in der sie mit Microsoft-Leuten über F # sprechen. Sie haben den größten Teil des Xbox Live-Bewertungssystems, das alles andere als trivial war, mit F # geschrieben. Das System skalierte massiv über Hunderte von Maschinen und sie waren sehr zufrieden damit.
quelle
Ich weiß nicht, ob es in Produktion ist, aber die KI für "The Path of Go" wurde in F # geschrieben:
http://research.microsoft.com/en-us/events/techvista2010/demolist.aspx#ThePathofGo
(Jemand anderes hat "TrueSkill" bereits erwähnt.)
quelle