F-Sharp

F-Sharp
Icon falscher Titel.svg 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 Quelltext

    let 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 als

    let do_twice f = f >> f

geschrieben werden.

Im obigen Beispiel wird für square der Typ int -> int ermittelt, das heißt square ist eine Funktion, die einen Parameter vom Typ int erwartet und einen Wert vom Typ int zurückgibt. Für do_twice erhält man den Typ ('a -> 'a) -> 'a -> 'a, das heißt do_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

Einzelnachweise

  1. Don Syme's WebLog on the F# Language and Related Topics: F# to ship as part of Visual Studio 2010
  2. F# at Microsoft Research research.microsoft.com

Wikimedia Foundation.

Игры ⚽ Поможем сделать НИР

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Sharp (surname) — Sharp is a surname. Sharp is cognate to the German dd. scharf . It is also akin to words which have the sense of scraping, e.g. Latin la. scrobis ditch , Russian ru. skresti to scrape .* Abraham Sharp (1651 1742), English schoolmaster,… …   Wikipedia

  • Sharp — Sharp, a. [Compar. {Sharper}; superl. {Sharpest}.] [OE. sharp, scharp, scarp, AS. scearp; akin to OS. skarp, LG. scharp, D. scherp, G. scharf, Dan. & Sw. skarp, Icel. skarpr. Cf. {Escarp}, {Scrape}, {Scorpion}.] 1. Having a very thin edge or fine …   The Collaborative International Dictionary of English

  • Sharp practice — Sharp Sharp, a. [Compar. {Sharper}; superl. {Sharpest}.] [OE. sharp, scharp, scarp, AS. scearp; akin to OS. skarp, LG. scharp, D. scherp, G. scharf, Dan. & Sw. skarp, Icel. skarpr. Cf. {Escarp}, {Scrape}, {Scorpion}.] 1. Having a very thin edge… …   The Collaborative International Dictionary of English

  • Sharp — K.K Rechtsform Kabushiki kaisha ISIN JP3359600008[1] Gründung …   Deutsch Wikipedia

  • Sharp Corporation — シャープ株式会社 Lema Be Sharp, From Sharp Minds Come Sharp Products Tipo Pública (TYO …   Wikipedia Español

  • Sharp Corporation — シャープ株式会社 Тип Публичная компания Листинг на бирже TYO …   Википедия

  • SHARP —  Pour l’article homophone, voir Sharpe. Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom …   Wikipédia en Français

  • sharp — [ʆɑːp ǁ ʆɑːrp] adjective a sharp increase, fall etc is very sudden and very big: • a sharp rise in interest rates • Unemployment generally brings a sharp fall in income. • The group reported a sharp decline in full year profits. sharply adverb …   Financial and business terms

  • sharp — [shärp] adj. [ME < OE scearp, akin to Ger scharf, ON skarpr < IE * (s)kerb(h) < base * (s)ker , to cut > SHEAR, HARVEST, L caro, flesh] 1. suitable for use in cutting or piercing; having a very thin edge or fine point; keen 2. having… …   English World dictionary

  • Sharp Nemesis NXT — at Mojave Role Racing aircraft Manufa …   Wikipedia

  • sharp — sharp, keen, acute can all mean having a fine point or edge, but it is in several of their extended senses that they are most likely to come into comparison. As applied to persons or their qualities, especially of intellect, all three can… …   New Dictionary of Synonyms

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”