Listen
main(_) ->
L = [5, 3, 9, 1, 7],
io:format("~p ~p ~p~n", [length(L), hd(L), tl(L)]),
io:format("~p~n", [[0 | L]]),
io:format("~p~n", [L ++ [8, 9]]),
io:format("~p~n", [lists:reverse(L)]),
io:format("~p~n", [lists:sort(L)]),
io:format("~p~n", [lists:sort(fun(A, B) -> A >= B end, L)]),
io:format("~p~n", [lists:map(fun(X) -> X * 2 end, L)]),
io:format("~p~n", [lists:filter(fun(X) -> X > 4 end, L)]),
io:format("~p~n", [lists:foldl(fun(X, Acc) -> X + Acc end, 0, L)]),
io:format("~p ~p~n", [lists:sum(L), lists:max(L)]),
io:format("~p~n", [lists:nth(2, L)]),
io:format("~p~n", [lists:member(9, L)]),
io:format("~p~n", [lists:seq(1, 5)]),
io:format("~p~n", [lists:split(2, L)]),
io:format("~p~n", [lists:sublist(L, 2, 3)]),
io:format("~p~n", [lists:zip([1, 2, 3], [a, b, c])]),
io:format("~p~n", [lists:flatten([1, [2, [3, 4]], 5])]),
io:format("~p~n", [lists:partition(fun(X) -> X rem 2 =:= 0 end, [1, 2, 3, 4, 5])]),
io:format("~p~n", [lists:any(fun(X) -> X > 8 end, L)]),
io:format("~p~n", [lists:all(fun(X) -> X > 0 end, L)]),
io:format("~p~n", [lists:duplicate(3, x)]),
io:format("~p~n", [lists:usort([3, 1, 2, 3, 1])]),
io:format("~p~n", [L -- [3, 9]]),
io:format("~p~n", [lists:keyfind(b, 1, [{a, 1}, {b, 2}])]),
io:format("~p~n", [lists:last(L)]).Ausgabe
5 5 [3,9,1,7]
[0,5,3,9,1,7]
[5,3,9,1,7,8,9]
[7,1,9,3,5]
[1,3,5,7,9]
[9,7,5,3,1]
[10,6,18,2,14]
[5,9,7]
25
25 9
3
true
[1,2,3,4,5]
{[5,3],[9,1,7]}
[3,9,1]
[{1,a},{2,b},{3,c}]
[1,2,3,4,5]
{[2,4],[1,3,5]}
true
true
[x,x,x]
[1,2,3]
[5,1,7]
{b,2}
7List Comprehensions
Listenbeschreibungen erzeugen Listen kompakt:
main(_) ->
io:format("~p~n", [[X * X || X <- lists:seq(1, 6)]]),
io:format("~p~n", [[X || X <- lists:seq(1, 10), X rem 2 =:= 0]]),
io:format("~p~n", [[{X, Y} || X <- [1, 2], Y <- [a, b]]]),
io:format("~p~n", [[X + Y || {X, Y} <- [{1, 2}, {3, 4}]]]),
io:format("~p~n", [[{A, B, C} || C <- lists:seq(1, 20), B <- lists:seq(1, C), A <- lists:seq(1, B), A * A + B * B =:= C * C]]),
io:format("~p~n", [[string:to_upper(S) || S <- ["ab", "cd"]]]),
io:format("~p~n", [<< <<(X * 2)>> || <<X>> <= <<1, 2, 3>> >>]).Ausgabe
[1,4,9,16,25,36]
[2,4,6,8,10]
[{1,a},{1,b},{2,a},{2,b}]
[3,7]
[{3,4,5},{6,8,10},{5,12,13},{9,12,15},{8,15,17},{12,16,20}]
["AB","CD"]
<<2,4,6>>Tupel
Tupel haben feste Größe; das erste Element ist oft ein Atom als „Tag“:
main(_) ->
P = {person, "Mia", 17},
{person, Name, Alter} = P,
io:format("~s ~p~n", [Name, Alter]),
io:format("~p ~p~n", [element(2, P), tuple_size(P)]),
P2 = setelement(3, P, 18),
io:format("~p~n", [P2]),
io:format("~p~n", [tuple_to_list({a, b, c})]),
io:format("~p~n", [list_to_tuple([1, 2, 3])]),
Ergebnis = {ok, 42},
case Ergebnis of
{ok, V} -> io:format("Erfolg ~p~n", [V]);
{error, Grund} -> io:format("Fehler ~p~n", [Grund])
end.Ausgabe
Mia 17
"Mia" 3
{person,"Mia",18}
[a,b,c]
{1,2,3}
Erfolg 42Maps
main(_) ->
M = #{name => "Mia", alter => 17},
io:format("~p~n", [maps:get(name, M)]),
io:format("~p~n", [maps:get(stadt, M, unbekannt)]),
M2 = M#{alter := 18, stadt => "Berlin"},
io:format("~p~n", [maps:size(M2)]),
io:format("~p~n", [lists:sort(maps:keys(M2))]),
io:format("~p~n", [maps:is_key(stadt, M2)]),
io:format("~p~n", [maps:to_list(maps:remove(stadt, M2))]),
#{alter := A} = M2,
io:format("~p~n", [A]),
io:format("~p~n", [maps:fold(fun(_, V, Acc) when is_integer(V) -> Acc + V; (_, _, Acc) -> Acc end, 0, M2)]),
Zaehler = lists:foldl(fun(C, Acc) -> maps:update_with(C, fun(N) -> N + 1 end, 1, Acc) end, #{}, "mississippi"),
io:format("~p~n", [lists:sort(maps:to_list(Zaehler))]),
io:format("~p~n", [maps:from_list([{a, 1}, {b, 2}])]),
io:format("~p~n", [maps:map(fun(_, V) -> V * 10 end, #{x => 1, y => 2})]),
io:format("~p~n", [maps:filter(fun(_, V) -> V > 1 end, #{x => 1, y => 2})]).Ausgabe
"Mia"
unbekannt
3
[alter,name,stadt]
true
[{alter,18},{name,"Mia"}]
18
18
[{105,4},{109,1},{112,2},{115,4}]
#{a => 1,b => 2}
#{x => 10,y => 20}
#{y => 2}Records
Records geben Tupel-Feldern Namen (zur Übersetzungszeit):
-record(person, {name, alter = 0, hobbys = []}).
main(_) ->
P = #person{name = "Mia", alter = 17},
io:format("~s ~p~n", [P#person.name, P#person.alter]),
P2 = P#person{alter = 18, hobbys = ["Lesen"]},
io:format("~p~n", [P2#person.hobbys]),
#person{name = N} = P2,
io:format("~s~n", [N]),
io:format("~p~n", [is_record(P, person)]),
io:format("~p~n", [P]).Ausgabe
Mia 17
["Lesen"]
Mia
true
{person,"Mia",17,[]}Merke
- Listen:
lists-Modul mitmap,filter,foldl,sort,seq,zip;hd/tl,++,-- - List Comprehensions
[Ausdruck || Muster <- Liste, Bedingung] - Tupel bündeln feste Daten; Records geben Feldern Namen; Maps sind Schlüssel-Wert-Tabellen
- Maps aktualisiert man mit
M#{k := v}(vorhandener Schlüssel) oderM#{k => v}(neu oder bestehend)
Aufgabe
Zähle mit einer Map die Wörter eines Satzes.