Funktionale Webprogrammierung mit F#
Leistungsstark für den Entwurf und die Implementierung von Berechnungsaufgaben
In der funktionalen Programmierung werden in erster Linie leichtgewichtige und kleine Funktionen genutzt. Komplexe Aufgaben und Anwendungen werden durch die Verknüpfung von Funktionen erreicht. Reine Funktionen, unveränderliche Strukturen, Typsicherheit und Mustervergleiche sorgen dabei dafür, dass ungültige Zustände im System verhindert werden können und bieten an den Systemgrenzen Validierung und exakte Transformation. Problemdomänen sind im Vergleich zu imperativen oder rein objektorientierten Vorgehensweisen klarer und einfacher modelliert und effizienzkritische Stellen können oft mühelos parallelisiert werden.
Grundlagen
- Absenkung der Komplexität von Geschäftsanwendungen als “Nebeneffekt” einer funktionalen Sprache
- Verwendungen von F#-Projekten mit anderen .NET-Programmiersprachen
- Der beste Weg, um eine funktionale Sprache zu erlernen: Tests in F# zu formulieren
Einsatzgebiete von funktionaler Programmierung
- Rechenintensive Prozesse
- Implementierung von Domänenmodellen und Überprüfung dieser durch die Fachabteilung
- Für Mitarbeiter ohne Programmierkenntnisse fachlich verständlichen Code schreiben
- Spracherweiterung mit eigenen Containern für asynchrone Programmierung und Querschnittsaspekte wie Queries (“LINQ”) oder Logging
- Gegenüber C# oder VB vereinfachte parallele Programmierung
- Erweiterte parallele Programmierung bzw. Ausführung von Prozessen per Computation Expressions
- auf der GPU mit Alea.cuBase oder
- in der Cloud mit mBrace
- Type Provider für typsichere Verarbeitung externer Daten
- FSharp.Data zum Einlesen von CSV-Dateien, Freebase, JSON und XML
- FSharp.Data.SQLProvider als Ersatz für Entity Framework und
- FSharp.Data.SqlClient zum typsicheren Zugriff auf ADO.NET und auf Stored Procedures
Erweiterte Einsatzgebiete
- Integration mit Windows Presentation Foundation (WPF) über Type Provider für XAML
- Maschinelles Lernen zur Analyse von Daten wie etwa für
- Optical Character Recognition (OCR) oder
- zur Erkennung der Korrelation von Daten (z. B. Wetter zu Pflanzenwachstum)
- Parserbau mit FParsec bzw. FsLex, FsYacc
Serverkommunikation
- Webanwendungen mit F#
- Implementierung einer ASP.NET Web API mit F#
- Nutzung eines Open Web Interface for .NET (OWIN) mit Freya
Konzepte funktionaler Programmierung
- Definition des Begriffs „Funktion“ / functions as first-class citizens
- Funktionen höherer Ordnung beispielsweise map, filter, fold oder reduce
- Anonyme Funktionen per fun und function
- Partielle Anwendung zum Beispiel für Dependency Injection oder Patterns wie Decorator
- Currying zur Transformation von Funktionen
- Komposition von Funktionen zu größeren Pipelines
- Verwendung von Rekursion
- Strukturelle Gleichheit von Daten
- Unverändlichkeit von Daten (Immutable) und der Zwang zur Transformation dieser (Pure Function)
- Veränderliche Daten (Mutable) bzw. gewünschte Seiteneffekte (Impure Function) als Ausnahme von der vorstehend genannten Regel aus Performancegründen oder bei Closures
- Strukturierung von F#-Programmen durch Module und Gruppierung von Verhalten
- Cache für Funktionsausführung per Memoization
Typensystem
- Kompakterer Code durch Typinferenz
- Spezielle funktionale Datentypen wie Arrays, Listen, Option und Verwendung der Standard-.NET-Datentypen
- Objektausdrücke: Lambda-Expressions für Interfaces
- Typerweiterungen für Extensions Methods
- Mustervergleich auf Datentypen
- Komplexe Verzweigungen für Mustervergleichsausdrücke mit match
- Erweiterung des Mustervergleichs um eigene Mustervergleichsausdrücke / Active Patterns
Testen
- Verwendung der Testing-Frameworks NUnit und xUnit
- FsUnit für einen funktionaleren Ansatz für Assertions
- Assertion-Bibliothek unquote für Komposition von Assertions / Vergleich von Objektbäumen
- FsCheck für regelbasiertes Testen
- Foq für Mocks
- Canopy als domänenspezifische Sprache (DSL) für Selenium-Tests
- TickSpec und Gherkin für Behavior Driven Development
Qualitätssicherung und Werkzeuge
- Integration in Visual Studio und Community-Projektvorlagen z. B. für Webanwendungen
- Verwendung von Xamarin und F# in Visual Studio
- WebSharper für HTML5-Webanwendungen
- Visual F# Power Tools für Syntaxhervorhebung und Refaktorisierung