Funktionen
Funktionen sind Werte und werden curryt:
let quadrat x = x * x
let addiere a b = a + b
let begruesse (name: string) = "Hallo, " + name + "!"
let plus10 = addiere 10
let verdopple = fun x -> x * 2
printfn "%d %d" (quadrat 7) (addiere 3 4)
printfn "%s" (begruesse "Mia")
printfn "%d" (plus10 5)
printfn "%d" (verdopple 21)
let zweimal f x = f (f x)
printfn "%d" (zweimal verdopple 5)
let komponiert = quadrat >> verdopple
printfn "%d" (komponiert 3)
printfn "%d" (3 |> quadrat |> verdopple)
let rec fak n = if n <= 1 then 1 else n * fak (n - 1)
let rec fib a b i = if i = 0 then a else fib b (a + b) (i - 1)
printfn "%d %d" (fak 10) (fib 0 1 40)
let teile a b = a / b, a % b // Tupel als Rückgabe
let q, r = teile 17 5
printfn "%d %d" q r
let inline addiereAlles (x: ^a) (y: ^a) = x + y
printfn "%d %.1f" (addiereAlles 1 2) (addiereAlles 1.5 2.5)49 7 Hallo, Mia! 15 42 20 18 18 3628800 102334155 3 2 3 4.0
Der Pipe-Operator |> reicht den linken Wert an die Funktion rechts weiter und macht Datenflüsse von links nach rechts lesbar.
Bedingungen
let vorzeichen n =
if n > 0 then "positiv"
elif n < 0 then "negativ"
else "null"
let fizzbuzz n =
match n % 3, n % 5 with
| 0, 0 -> "FizzBuzz"
| 0, _ -> "Fizz"
| _, 0 -> "Buzz"
| _ -> string n
let note n =
match n with
| 1 -> "sehr gut"
| 2 | 3 -> "gut bis befriedigend"
| n when n >= 4 && n <= 5 -> "ausreichend bis mangelhaft"
| _ -> "ungültig"
printfn "%s %s %s" (vorzeichen 5) (vorzeichen -2) (vorzeichen 0)
printfn "%s" (String.concat " " (List.map fizzbuzz [1 .. 15]))
printfn "%s %s %s" (note 1) (note 3) (note 9)
let status = if 15 > 10 then "groß" else "klein"
printfn "%s" statuspositiv negativ null 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz sehr gut gut bis befriedigend ungültig groß
Schleifen
F# hat Schleifen, nutzt aber meist Rekursion und Sequenzfunktionen:
for i in 1 .. 5 do printf "%d " i
printfn ""
for i in 5 .. -1 .. 1 do printf "%d " i
printfn ""
for x in [ "a"; "b"; "c" ] do printf "%s " x
printfn ""
for i in 0 .. 2 .. 10 do printf "%d " i
printfn ""
let mutable k = 0
while k < 3 do
printf "w%d " k
k <- k + 1
printfn ""
[ 1; 2; 3 ] |> List.iter (fun x -> printf "%d " (x * x))
printfn ""
[ "x"; "y" ] |> List.iteri (fun i s -> printf "%d:%s " i s)
printfn ""1 2 3 4 5 5 4 3 2 1 a b c 0 2 4 6 8 10 w0 w1 w2 1 4 9 0:x 1:y
Merke
- Funktionen:
let f x y = ..., curryt, partiell anwendbar;>>komponiert,|>verkettet if/elif/elsesind Ausdrücke;matchmit Mustern und Wächtern (when)- Rekursion mit
let rec;for/whilefür imperativen Stil - Tupel erlauben mehrere Rückgabewerte
Aufgabe
Schreibe ggt a b rekursiv und gib den ggT von 48 und 18 aus.