Kurz: Eine Funktion besteht aus Klauseln, die von oben nach unten per Mustervergleich geprüft werden. Klauseln werden mit ; getrennt:
Teil des Kurses Erlang
Funktionen mit mehreren Klauseln
Eine Funktion besteht aus Klauseln, die von oben nach unten per Mustervergleich geprüft werden. Klauseln werden mit ; getrennt:
-export([main/1]).
fak(0) -> 1;
fak(N) when N > 0 -> N * fak(N - 1).
vorzeichen(N) when N > 0 -> positiv;
vorzeichen(N) when N < 0 -> negativ;
vorzeichen(0) -> null.
flaeche({kreis, R}) -> math:pi() * R * R;
flaeche({rechteck, B, H}) -> B * H;
flaeche({quadrat, S}) -> S * S.
begruesse(Name) -> begruesse(Name, "Hallo").
begruesse(Name, Gruss) -> Gruss ++ ", " ++ Name ++ "!".
main(_) ->
io:format("~p~n", [fak(10)]),
io:format("~p ~p ~p~n", [vorzeichen(5), vorzeichen(-2), vorzeichen(0)]),
io:format("~.2f ~p ~p~n", [flaeche({kreis, 1}), flaeche({rechteck, 3, 4}), flaeche({quadrat, 5})]),
io:format("~s~n", [begruesse("Mia")]),
io:format("~s~n", [begruesse("Tom", "Servus")]).Ausgabe:
3628800
positiv negativ null
3.14 12 25
Hallo, Mia!
Servus, Tom!Die Funktion fak/1 wird mit Name und Stelligkeit bezeichnet (fak/1). begruesse/1 und begruesse/2 sind verschiedene Funktionen. Wächter (when) verfeinern Muster um Bedingungen.
Bedingungen: if, case und Wächter
main(_) ->
N = 15,
Text = case {N rem 3, N rem 5} of
{0, 0} -> "FizzBuzz";
{0, _} -> "Fizz";
{_, 0} -> "Buzz";
_ -> integer_to_list(N)
end,
io:format("~s~n", [Text]),
Gross = if N > 10 -> groß; true -> klein end,
io:format("~p~n", [Gross]),
Pruefe = fun(X) when is_integer(X), X > 0 -> positiv;
(X) when is_integer(X) -> nicht_positiv;
(_) -> kein_integer
end,
io:format("~p ~p ~p~n", [Pruefe(5), Pruefe(-1), Pruefe(a)]),
io:format("~p~n", [case [1, 2, 3] of [_, Zweites | _] -> Zweites end]),
io:format("~p~n", [(1 < 2) andalso (2 < 3)]),
io:format("~p~n", [(1 > 2) orelse (2 < 3)]),
io:format("~p~n", [not false]),
io:format("~p~n", [1 =:= 1.0]),
io:format("~p~n", [1 == 1.0]),
io:format("~p~n", [1 =/= 2]).Ausgabe:
FizzBuzz
gro�
positiv nicht_positiv kein_integer
2
true
true
true
false
true
trueHinweis
==vergleicht Werte (1 == 1.0ist wahr),=:=vergleicht exakt (1 =:= 1.0ist falsch).ifbenötigt immer einen Zweig mittrue.
Anonyme Funktionen (Funs)
main(_) ->
Verdopple = fun(X) -> X * 2 end,
Addiere = fun(A, B) -> A + B end,
io:format("~p ~p~n", [Verdopple(21), Addiere(3, 4)]),
Fak = fun F(0) -> 1; F(N) -> N * F(N - 1) end,
io:format("~p~n", [Fak(10)]),
Anwenden = fun(F, X) -> F(F(X)) end,
io:format("~p~n", [Anwenden(Verdopple, 5)]),
Addierer = fun(N) -> fun(X) -> X + N end end,
Plus10 = Addierer(10),
io:format("~p~n", [Plus10(5)]),
io:format("~p~n", [lists:map(fun erlang:abs/1, [-1, 2, -3])]),
io:format("~p~n", [lists:map(fun(X) -> X * X end, [1, 2, 3, 4])]),
io:format("~p~n", [(fun lists:reverse/1)([1, 2, 3])]).Ausgabe:
42 7
3628800
20
15
[1,2,3]
[1,4,9,16]
[3,2,1]Merke
- Funktionen werden durch Mustervergleich in mehreren Klauseln definiert (
;trennt,.beendet) - Wächter (
when) fügen Bedingungen hinzu;caseundifverzweigen ==vergleicht Werte,=:=exakt- Funs sind anonyme Funktionen und Closures;
fun name/arityverweist auf benannte Funktionen
Übungsaufgabe
Schreibe fib/1 mit mehreren Klauseln und gib die ersten zehn Fibonacci-Zahlen aus.
Quiz zur Selbstkontrolle
Wofür steht fak/1?
- Funktion fak mit einem Argument (richtig)
- Fakultät mit einer Zahl
- Eine Variable
- Ein Atom
Wie trennt man Funktionsklauseln?
- Mit Semikolon (richtig)
- Mit Komma
- Mit Punkt
- Mit Doppelpunkt
Was ist der Unterschied zwischen == und =:=?
- =:= vergleicht auch den Typ exakt (richtig)
- Kein Unterschied
- == ist für Strings
- =:= ist veraltet
Weiter im Kurs
Zurück: Einführung und erstes Programm
Weiter: Listen, Tupel, Maps und Records
Alle Kapitel: Erlang im Überblick