y

Werbung
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
Herunterladen