F-Sharp (F#) Eine multiparadigmatische Sprache Merkmale von F# • Multiparadigmatisch • .NET-Sprache • Skalierbar und effizient • Als Forschungsprojekt von Microsoft Research entwickelt und 2002 publiziert • Starke syntaktische Ähnlichkeit mit OCaml Einsatzgebiete von F# • Sicherheitskritische Aufgaben • Datenverarbeitung • Beschreibung komplexer physikalischer, mathematischer Zusammenhänge Unterschiede zu Haskell • Haskell ist eine rein funktionale Sprache • Kein deklarieren von Funktionen in F# • Rekursive Funktionen müssen in F# mit ‚rec‘ markiert sein • In F# muss alles mit ‚let‘ definiert werden • F# bietet Units of Measure • F# hat direkten Zugriff zum .NET-Framework Discriminated Unions open System //wegen Convert.ToString() type Tree<'a> = | Leaf | Branch of Tree<'a> * 'a * Tree<'a> with member this.Print = match this with | Leaf -> | Branch(_, key, _) -> let tree1 = Branch(Leaf, 10, Leaf) tree1.Print printfn "Blatt" printfn "Knoten mit dem Wert %s" (Convert.ToString(key)) Klassen, Vererbung, Schnittstellen type Shape(x : float, y : float) = let mutable x_pos = x let mutable y_pos = y new () = Shape( 0.0, 0.0) member this.X = x_pos; member this.Y = y_pos; member this.Move dX dY = x_pos <- x_pos + dX y_pos <- y_pos + dY type IDrawable = abstract member Draw : unit -> unit type Circle( x: float, y : float, r : float) = inherit Shape(x, y) let mutable radius = r interface IDrawable with member this.Draw() = printfn "Draw Circle(%f, %f)" this.X this.Y Pattern matching let SayHello name lang = match name, lang with | "Frank", _ -> | _, "ger" -> | _, "eng" -> | "Mike", _ | "Alie", _ -> | _, _ -> let sign = function | 0 -> | x when x > 0 -> | _ -> 0 1 -1 printfn printfn printfn printfn printfn == "Hi, Frank" "Hallo, %s. Wie geht's?" name "Hello, %s." name "Na du!" "Hey!" let sign x = match x with | 0 -> 0 | x when x > 0 -> 1 | _ -> -1 Funktionen höherer Ordnung let list = [1..30] let double_list = List.map (fun x -> x * 2) list let filter_list = List.filter (fun x -> (x % 2) = 0) list let zip_list = List.zip double_list filter_list //Fehler: Listen sind nicht gleich lang let rec myZip f list1 list2 = match list1, list2 with | [], [] | _, [] | [], _ | x :: xss, y :: yss -> [] -> (x, y, (f x y)) :: myZip f xss yss Lazy Evaluation let rec fibu = function | 0 -> 0 | 1 -> 1 | x -> fibu (x - 1) + fibu (x - 2) let x = Lazy<int>.Create(fun _ -> printfn "Werte x aus..."; fibu 20) let y = Lazy<int>.Create(fun _ -> printfn "Werte y aus..."; x.Value + 10) Quellen • Programming F# - A Comprehensive Guide for Writing Simple Code to Solve Complex Problems, Chris Smith • http://msdn.microsoft.com/de-de/magazine/cc164244.aspx#S1 • http://msdn.microsoft.com/de-de/library/vstudio/dd233181.aspx