- F-Sharp
-
Der korrekte Titel dieses Artikels lautet „F#“. Diese Schreibweise ist aufgrund technischer Einschränkungen nicht möglich. F# Paradigmen: multiparadigmatisch: funktional, imperativ, objektorientiert Erscheinungsjahr: 2002 Entwickler: Microsoft Aktuelle Version: 2.0 (12. April 2010) Typisierung: statisch, stark, implizit Einflüsse: Objective CAML, C#, Haskell Betriebssystem: plattformübergreifend Lizenz: Apache-Lizenz 2.0 Microsoft F# Developer Center F# ist eine funktionale Programmiersprache von Microsoft für das .NET-Framework. F# ist mit den Sprachen OCaml und ML verwandt, die Syntax der Sprachen ähneln sich daher stark. Viele OCaml-Programme, die ungewöhnliche Konstrukte und Caml-spezifische Bibliotheken vermeiden, können deswegen ohne Änderung mit F# kompiliert werden.
Neben den Bestandteilen der funktionalen Programmierung sind in F# objektorientierte sowie imperative Sprachkonstrukte enthalten.
Ursprünglich wurde F# als Forschungsprojekt von Microsoft Research entwickelt, derzeit wird es von Microsofts Entwicklungsabteilung fortgeführt. F# wird als Teil von Visual Studio 2010 erstmals offiziell unterstützt und mit ausgeliefert.[1] Außerdem ist es auch als Erweiterung zu Visual Studio 2008 erhältlich.[2] Im November 2010 wurde F# sowie zugehörige Compiler und Bibliotheken unter der Apache-2.0-Lizenz freigegeben.
Inhaltsverzeichnis
Einige Sprachmerkmale
In F# gibt es keine Variablen wie in anderen Programmiersprachen. Es gibt nur Funktionen, die immer denselben Rückgabewert haben. Diese werden in F# mit dem Schlüsselwort
let
deklariert und definiert.let pi = 3.1415927
F# bietet Typableitung, d. h. Typen von Ausdrücken werden automatisch ermittelt. Beispielsweise bekommt
pi
automatisch den Typ des Gleitkommazahl-Literals zugewiesen.let
ist dabei keine Variablenzuweisung, sondern eine Deklaration, d.h. der Quelltextlet pi = 3.1415927 let pi = 10.0
kann nicht kompiliert werden, da der Wert
pi
zweimal innerhalb desselben Gültigkeitsbereichs deklariert wird. Soll der Wert einer Variablen im Programmablauf änderbar sein, muss dies bereits bei der Deklaration kenntlich gemacht werden:let mutable x = 0 // x wird durch das "mutable"-Schlüsselwort als veränderlich gekennzeichnet x <- 5 // x wird ein neuer Wert zugewiesen printfn "%i" x // Gibt 5 aus
Werte im Nachhinein zu verändern ist auch durch die Verwendung von sogenannten reference cells möglich:
let x = ref 0 // x hat den Typ "int ref", ist also eine Referenz auf einen Integer x := 5 // x wird ein neuer Wert zugewiesen printfn "%i" !x // Mittels des "!"-Operators wird x dereferenziert. Gibt 5 aus.
Funktionen werden wie andere Werte mit
let
deklariert:let square x = x * x
Funktionen können Funktionen als Parameter erwarten (siehe Funktion höherer Ordnung):
let do_twice f x = f (f x)
Die Anweisung
printfn "%A" (do_twice square 5)
gibt 625 (das Quadrat des Quadrats von 5) aus. Die Funktion
do_twice
kann mit Hilfe des Kompositionsoperators und nach eta-Reduktion auch alslet do_twice f = f >> f
geschrieben werden.
Im obigen Beispiel wird für
square
der Typ int -> int ermittelt, das heißtsquare
ist eine Funktion, die einen Parameter vom Typint
erwartet und einen Wert vom Typint
zurückgibt. Für do_twice erhält man den Typ ('a -> 'a) -> 'a -> 'a, das heißtdo_twice
ist eine Funktion, die als ersten Parameter einen Wert vom Typ ('a -> 'a) (eine Funktion mit einem Parameter vom Typ 'a und einem Rückgabewert vom Typ 'a) bekommt, als zweiten Parameter einen Wert vom Typ 'a, und einen Wert vom Typ 'a zurückgibt. 'a hat hier die Rolle einer Typvariable (grob vergleichbar mit Generic- oder Template-Parametern in Java/C++, siehe Polymorphie (Programmierung)).F# ermöglicht Closures und verwendet Currying:
let add x y = x + y let inc = add 1
In der Definition von inc wird der erste Parameter der Funktion add an den Wert 1 gebunden. Das Ergebnis dieser partiellen Funktionsanwendung ist eine neue Funktion mit nur noch einem Parameter. Die Auswertung des Ausdrucks
inc 5
liefert als Ergebnis 6.
F# unterstützt Tupel:
let u = (3, 6) let v = (2, -3) let add (a, b) (c, d) = (a + c, b + d) let x, y = add u v
F# bietet Discriminated Unions und Pattern Matching:
// Ein Element vom Typ Baum ist entweder ein "Ast" und enthält zwei Elemente vom Typ "Baum", // oder es ist ein "Blatt" und enthält einen Integer type Baum = | Ast of Baum * Baum | Blatt of int let rec baumSumme x = match x with | Ast(l, r) -> baumSumme l + baumSumme r | Blatt(x) -> x
In F# ist auch objektorientiertes Programmieren möglich. Beispiel für eine Klassendeklaration:
type Person = val name : string val mutable age : int new(n, a) = { name = n; age = a } member x.Name = x.name member x.Age with get() = x.age and set(v) = x.age <- v member x.Print() = printfn "%s ist %i Jahre alt." x.name x.age
F# ist konform mit der Common Language Infrastructure. Somit kann in F# auf Typen zugegriffen werden, die in anderen .NET-Sprachen geschrieben sind, und umgekehrt. Nullzeiger werden nur für die Interaktion mit Klassen aus dem .NET-Framework benötigt.
Compiler und Interpreter
F#-Code wird kompiliert, hierbei entsteht Zwischencode in der Common Intermediate Language (CIL), genau wie bei Programmen, die in C# oder VB.NET geschrieben wurden.
Abgesehen vom F#-Compiler (fsc) gibt es auch einen F#-Interpreter (fsi), der F#-Code interaktiv ausführt. Eingaben im Interpreter sind mit
;;
abzuschließen, wodurch auch mehrzeilige Eingaben ermöglicht werden.Beispiel
Folgende Beispiele geben „Hello World“ aus.
let main = System.Console.WriteLine("Hello World")
oder
printfn "Hello World"
Die folgende Funktion implementiert die rekursive Ackermannfunktion:let rec ack m n = if m = 0 then n + 1 else if n = 0 then ack (m - 1) 1 else ack (m - 1) (ack m (n - 1))
Weblinks
- MSDN Webcasts: Eine neue Programmiersprache ist in Sicht - F# - Teil 1 - Eine Einführung
- MSDN Webcasts: Eine neue Programmiersprache ist in Sicht - F# - Teil 2 - Die Sprach-Features
- Microsoft F# Developer Center im MSDN (englisch)
- F#-Homepage von Microsoft Research (englisch)
- The F# Survival Guide (englisch)
Einzelnachweise
- ↑ Don Syme's WebLog on the F# Language and Related Topics: F# to ship as part of Visual Studio 2010
- ↑ F# at Microsoft Research research.microsoft.com
Wikimedia Foundation.