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.