Sie sind hier
E-Book

F#

Einstieg und praktische Anwendung

AutorOliver Sturm
Verlagentwickler.press
Erscheinungsjahr2012
Seitenanzahl188 Seiten
ISBN9783868022704
FormatPDF/ePUB
Kopierschutzkein Kopierschutz/DRM
GerätePC/MAC/eReader/Tablet
Preis18,99 EUR
Mit Visual Studio 2010 hielt eine neue Programmiersprache in der .NET-Welt Einzug: F#. Das Stadium der Forschungssprache hat F# hinter sich gelassen und stellt Ihnen mit seinem hybriden Ansatz Möglichkeiten zur Verfügung, die weit über das Können anderer .NET-Sprachen hinausgehen. Die objektorientierte Welt ist sogar besser als in C# unterstützt und die funktionale Programmierung eröffnet in vielen Bereichen neue und effizientere Wege. Suchen Sie nach der leistungsfähigsten .NET-Sprache? Mögen Sie funktionale Ideen wie LINQ und interessieren sich für Ähnliches in anderen Bereichen? Erwarten Sie von Ihrer Sprache der Wahl größtmögliche Flexibilität und beste Hilfestellung in jeder Programmiersituation? Dann ist dieses Buch für Sie. Anhand von klaren Beispielen ermöglicht Oliver Sturm einen einfachen Einstieg in die neue Denkweise von F# und bietet dem Leser die Möglichkeit, schon nach kurzer Zeit eigene produktive Anwendungen zu erstellen. Ein Buch für Programmierer und Entwickler im .NET/Visual-Studio-Umfeld. Alle, die die neue Sprache kennen lernen wollen.

Oliver Sturm ist Berater und Trainer für Themenbereiche der .NET-Softwarearchitektur. Er ist Associate Consultant bei thinktecture und bekannt als Autor von Kursmaterialien und Artikeln. Als Experte für Programmiersprachen und Microsoft C# MVP ist er weiterhin bekannt für seine Erfahrungen im Spezialbereich von DevExpress-UI-Komponenten und Frameworks. Unter http://www.oliversturm.com finden Sie mehr Informationen.

Kaufen Sie hier:

Horizontale Tabs

Leseprobe

2 Funktionen im Detail

Sie sind sicher nicht überrascht zu hören, dass funktionale Programmierung in F#, wie auch in anderen Sprachen, die ganz oder teilweise der funktionalen Idee verhaftet sind, auf modularen Funktionen basiert. Manche solche Funktionen schreiben Sie selbst, andere sind Bestandteil der F#-Laufzeitumgebung oder sogar des .NET Frameworks.

Jenseits der „einfachen“ Deklaration und Implementierung von Funktionen sind Techniken notwendig, um den Aspekt der Modularisierung zu realisieren. Wenn Funktionen als Bausteine dienen sollen, muss es möglich und sogar einfach sein, sie zusammenzufügen, aus ihnen neue Funktionen zu bauen. Die dazu dienlichen Techniken werden gern unter der Bezeichnung Function Construction zusammengefasst.

Dieses Kapitel deckt beide Bereiche ab. Sie werden sehen, welche detaillierten Fähigkeiten F# zur Deklaration und Implementierung von Funktionen bietet und wie diese mit Techniken der Function Construction zu größeren Elementen zusammengebaut werden können.

2.1 Deklarationen

Im ersten Kapitel haben Sie bereits gesehen, wie Sie in F# Funktionen deklarieren können. Hier ist noch einmal die einfache Funktion add, die bereits als Beispiel gezeigt wurde:

let add x y = x + y

Listing 2.1: Die einfache Funktion „add“

Sie haben auch gesehen, dass die Funktionsimplementierung umgebrochen und über mehrere Zeilen gestreckt werden kann, wobei die Einrückung die Struktur der Funktion repräsentiert. Etwa so:

let add x y =
x + y

Listing 2.2: „add“, deklariert mit Umbruch

Wie andere moderne Programmiersprachen bietet F# die Möglichkeit, Funktionen auch anonym, also namenlos, zu erzeugen. C# etwa bietet hierzu zwei unterschiedliche Syntaxvarianten, die anonymen Funktionen und die Lambda-Ausdrücke. Letztere sind in den meisten anderen Sprachen, besonders denen aus der funktionalen Sprachwelt, der „normale“ Mechanismus zur Erzeugung von anonymen Funktionen. F# ist hier keine Ausnahme: mit dem Schlüsselwort fun (kurz für Function, nicht als Übersetzung von Spaß zu verstehen) erzeugen Sie einen Lambda-Ausdruck:

let add' = fun x y -> x + y

Listing 2.3: „add’“, als Lambdaausdruck implementiert

Die Syntax add', gesprochen add Strich, die hier verwendet wird, um eine Variante der Funktion add zu erzeugen, haben Sie schon zuvor gesehen. Mit dem Schlüsselwort fun wird die Erzeugung eines Lambdaausdrucks eingeleitet. Eine Parameterliste für den Ausdruck folgt dem Schlüsselwort, und auf der rechten Seite des Operators ->, gesprochen goes to, findet sich die Implementierung, der Body, des Ausdrucks.

Hinweis: Sicherlich haben Sie bemerkt, dass die Funktion, die hier in Form des Lambdaausdrucks deklariert wird, in dem Wert add‘ abgelegt und somit gewissermaßen mit einem Namen versehen wird. Man könnte also darüber streiten, ob in diesem Fall von einer anonymen Funktion die Rede sein darf ? schließlich steht die Funktion unter dem Namen add‘ zum Aufruf zur Verfügung. Allerdings nennt man oft auch in dieser Situation die Funktion anonym, da kein Name dafür innerhalb der syntaktischen Sprachelemente der Deklaration festgelegt wurde. Die Zuweisung an den Wert add‘ geschieht hier nur, damit ein vollständiges, gültiges Statement im Sinne von F# daraus wird. Praktisch werden Lambdaausdrücke oft auch ohne Zuweisung erzeugt, wie Sie weiter unten sehen werden.

Offensichtlich ist der syntaktische Unterschied zwischen einer „normalen“ Funktionsdeklaration und der eines Lambdaausdrucks in F# nicht groß. Tatsächlich sind auch die Ergebnisse beider Techniken kaum zu unterscheiden. Wenn Sie die beiden Zeilen in Visual Studio eingeben und sich die Meldung von IntelliSense mit der Maus ansehen, sehen Sie dies:

val add: int -> int -> int
val add': int -> int -> int

Listing 2.4: Signaturen von „add“ und „add’“ im Vergleich

In diesem Fall, in dem auch der Lambdaausdruck unmittelbar einem Wert zugewiesen wird, erzeugt der Compiler für beide Funktionen tatsächlich genau denselben Code. Das ist grundsätzlich unterschiedlich von der Vorgehensweise anderer .NET-Sprachcompiler, wie etwa C#, wo vollwertige benannte Methoden prinzipiell anders gehandhabt werden als anonyme Methoden.

2.2 Funktionen sind Werte

Sie haben es sich anhand der bisherigen Beispiele dieses Kapitels vielleicht schon gedacht: Funktionen sind in F# auch „nur“ Werte, die ebenso wie andere Werte abgelegt, aber auch als Parameter übergeben oder als Rückgabewerte zurückgegeben werden können. Dabei sorgt die Unterstützung von Typherleitung dafür, dass dies unglaublich einfach geht. Sehen Sie sich dieses Stück Code an:

let checkThis item f =
if f item then
printfn "HIT"
else
printfn "MISS"

checkThis 5 (fun x -> x > 3)
checkThis "hi there" (fun x -> x.Length > 5)

Listing 2.5: Eine Funktion als Parameter übergeben

Die Funktion checkThis hat zwei Parameter mit den Namen item und f. Es gibt keine Typannotationen, sodass der Compiler selbst alle Typen herleiten muss. In IntelliSense wird die Signatur der Funktion so angezeigt:

val checkThis: 'a -> ('a -> bool) -> unit

Listing 2.6: Die Signatur von „checkThis“

Der Typ des ersten Parameters wird mit 'a angegeben, wobei es sich um einen generischen Typparameter handelt. Der Compiler hält es also nicht für nötig, irgendwelche Einschränkungen für den Typ zu definieren. Wichtig: Das bedeutet nicht, dass der Compiler nichts über den Typ weiß. Die Funktion tut nichts mit dem Wert item, weshalb dessen Typ besonderen Anforderungen genügen müsste. F# betreibt in diesem Fall „automatische Verallgemeinerung“ (englisch: Automatic Generaliza­tion) und beschreibt den Typ so umfassend wie möglich, also in diesem Fall mit einem offenen generischen Parameter.

Der zweite Parameter hat den Typ 'a -> bool. Die Anwesenheit des goes-to-Operators deutet darauf hin, dass f als Funktionstyp erkannt worden ist. Diese Tatsache leitet der Compiler aus der Verwendung von f in dem if-Ausdruck her. In dem Ausdruck if f item then... kann f syntaktisch nur für eine Funktion stehen, die einen Parameter entgegennimmt (dieser muss vom selben Typ sein wie der zuvor besprochene Funktionsparameter item) und bool als Rückgabetyp erzeugt (Letzteres, weil f nur mit einem bool-Rueckgabetyp in dem if-Ausdruck verwendet werden kann).

Der letzte Teil der Funktionssignatur von checkThis ist das unit am Ende der goes-to-Kette. unit in F# ist ähnlich wie etwa void in C#: ein Typ, der keiner ist. Wenn unit in Signaturen vorkommt, bedeutet dies, dass eben kein Rückgabewert erzeugt wird, oder auch, in anderen Situationen, dass keine Parameter übergeben werden. Wenn Sie gern explizite Typannotationen verwenden möchten, können Sie die Funktion auch so deklarieren:

let checkThis' (item: 'c) (f: 'c -> bool) : unit =
if f item then
printfn "HIT"
else
printfn "MISS"

Listing 2.7: „checkThis’“, deklariert mit Typannotationen

Damit nehmen Sie dem Compiler die Arbeit ab, die Typen selbst herzuleiten. Sie verlieren aber auch die Flexibilität, die sich aus automatischer Typherleitung ergibt, gar nicht von der Kürze des Codes zu reden. Die meisten F#-Programmierer verwenden Typannotationen nur, wenn es notwendig ist ? hierfür gibt es verschiedene Gründe, die in späteren Beispielen noch erwähnt werden. Im Allgemeinen überlässt man aber gern dem Compiler die Arbeit, solange die Herleitung nicht irrtümlich falsche Typen annimmt.

2.3 Function Construction

Function Construction, deutsch „Funktionskonstruktion“, bezeichnet eine Familie von Techniken, mit deren Hilfe funktionale Programmierer aus existierenden Funktionen neue bauen. Die Idee ist, dass die Funktion zum Baustein wird. Objektorientierte Programmierer verwenden Klassen und Interfaces als Bausteine; wenn Gedanken von effizienter Wiederverwendung einmal implementierter Funktionalität in der funktionalen Welt umgesetzt werden sollen, tritt die Funktion an die Stelle des wiederverwendbaren Moduls. In den folgenden zwei Abschnitten lernen Sie zwei wichtige Techniken kennen, mit denen F# Ihnen diese Arbeit erleichtert.

2.3.1 Partial Application

Die folgenden beiden Varianten der einfache Funktion add haben Sie schon gesehen:

let add x y = x + y
let add‘ = fun x y -> x + y

Listing 2.8: Varianten von „add“

Wie Sie wissen, werden beide Deklarationen vom Compiler mit derselben Signatur hergeleitet:

int -> int -> int

Es gibt noch eine dritte Variation, mit der sich ebenfalls dieselbe Signatur erzeugen lässt:

let add'' x = fun y -> x +...
Blick ins Buch

Weitere E-Books zum Thema: Programmiersprachen - Softwareentwicklung

Das große Python3 Workbook

E-Book Das große Python3 Workbook

Python3 ist in der beruflichen Bildung sowie in Studium und Praxis eine der beliebtesten Programmiersprachen. Dieses Arbeitsbuch ist als Workbook aufbereitet, wie Sie es aus dem Sprachunterricht ...

Angular

E-Book Angular

Egal, ob Sie schon Erfahrung mit AngularJS 1.x haben oder nicht - mit diesem Buch gelingt Ihnen der schnelle Einstieg in das neue Angular-Framework ab Version 4. Anhand eines anspruchsvollen ...

Blockchain für Entwickler

E-Book Blockchain für Entwickler

Alles, was Sie als Blockchain-Entwickler wissen müssen Grundlagen, Konzepte, Codebeispiele für die Blockchain Apps auf der Ethereum-Blockchain mit Solidity programmieren Datenstruktur, ...

VBA mit Access

E-Book VBA mit Access

»Ein gelungener Mix aus Nachschlagewerk und Praxis-Beispielen. Sehr gut!« - dotnetpro zur Vorauflage Das Standardwerk zu VBA mit Access! Grundlagen und fortgeschrittene VBA-Programmierung ...

C++17

E-Book C++17

Setzen Sie modernes C++ schon in Ihrer täglichen Arbeit ein? Warum eigentlich nicht? Der neue Standard enthält viele Erweiterungen, die Ihnen das Programmiererleben leichter und Ihre Anwendungen ...

Weitere Zeitschriften

A&D KOMPENDIUM

A&D KOMPENDIUM

Das A&D KOMPENDIUM ist das jährlich neue Referenzbuch für industrielle Automation. Mit einer Auflage von 10.500 Exemplaren informiert das A&D KOMPENDIUM auf 400 Seiten über Produkte,Verfahren, ...

MENSCHEN. das magazin

MENSCHEN. das magazin

MENSCHEN. das magazin informiert über Themen, die das Zusammenleben von Menschen in der Gesellschaft bestimmen -und dies konsequent aus Perspektive der Betroffenen. Die Menschen, um die es geht, ...

Atalanta

Atalanta

Atalanta ist die Zeitschrift der Deutschen Forschungszentrale für Schmetterlingswanderung. Im Atalanta-Magazin werden Themen behandelt wie Wanderfalterforschung, Systematik, Taxonomie und Ökologie. ...

crescendo

crescendo

Die Zeitschrift für Blas- und Spielleutemusik in NRW- Informationen aus dem Volksmusikerbund NRW - Berichte aus 23 Kreisverbänden mit über 1000 Blasorchestern, Spielmanns- und Fanfarenzügen - ...

dental:spiegel

dental:spiegel

dental:spiegel - Das Magazin für das erfolgreiche Praxisteam. Der dental:spiegel gehört zu den Top 5 der reichweitenstärksten Fachzeitschriften für Zahnärzte in Deutschland (laut LA-DENT 2011 ...

Deutsche Hockey Zeitung

Deutsche Hockey Zeitung

Informiert über das internationale, nationale und internationale Hockey. Die Deutsche Hockeyzeitung ist Ihr kompetenter Partner für Ihr Wirken im Hockeymarkt. Sie ist die einzige ...

Dr. med. Mabuse

Dr. med. Mabuse

Zeitschrift für alle Gesundheitsberufe Seit über 40 Jahren sorgt die Zeitschrift Dr. med. Mabuse für einen anderen Blick auf die Gesundheits- und Sozialpolitik. Das Konzept einer Zeitschrift ...

e-commerce magazin

e-commerce magazin

PFLICHTLEKTÜRE – Seit zwei Jahrzehnten begleitet das e-commerce magazin das sich ständig ändernde Geschäftsfeld des Online- handels. Um den Durchblick zu behalten, teilen hier renommierte ...

ERNEUERBARE ENERGIEN

ERNEUERBARE ENERGIEN

ERNEUERBARE ENERGIEN informiert durch unabhängigen Journalismus umfassend über die wichtigsten Geschehnisse im Markt der regenerativen Energien. Mit Leidenschaft sind wir stets auf der Suche nach ...