EMZETT.
Login

Kurz: Funktionen sind Werte und werden curryt:

Teil des Kurses F#

Kapitel 2 von 8 im Kurs F#. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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)

Ausgabe:

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" status

Ausgabe:

positiv 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 ""

Ausgabe:

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/else sind Ausdrücke; match mit Mustern und Wächtern (when)
  • Rekursion mit let rec; for/while für imperativen Stil
  • Tupel erlauben mehrere Rückgabewerte

Übungsaufgabe

Schreibe ggt a b rekursiv und gib den ggT von 48 und 18 aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Einführung und erstes Programm

Weiter: Listen, Arrays, Maps und Sequenzen

Alle Kapitel: F# im Überblick