OK, Erlang und was man mit einer Liste machen kann .....
Allgemein Erlang
Listen, waren die Dinger, welche zwischen [] (eckigen Klammern) durch Komma (,) getrennte Einträge hatten ....
Wie kann man nun zum Beispiel die Summe von einer Liste berechnen?
Kategorie Listen, waren die Dinger, welche zwischen [] (eckigen Klammern) durch Komma (,) getrennte Einträge hatten ....
Wie kann man nun zum Beispiel die Summe von einer Liste berechnen?
Nicht vergessen wir bewegen uns in der
Funktionalen Welt, d.h. Rekursion ist angesagt.........
Nehmen wir einmal an, wir hätten eine Funktion sum(Liste,Startwert), welche als Ergebnis zurückliefern soll die Summe der Listenelemente + den Startwert .... dann wäre sum(Liste,0) unser gewünschtes Ergebnis, nehme ich mal so an
Die Funktion sum(Liste,Startwert), sollte natürlich Startwert zurückgeben, wenn die Liste leer ist,
dies schreibt man in Erlang so ->
sum([],N) -> N
ist die Liste dagegen nicht leer, und ich bezeichne mit H, dass erste Listenelement und mit T den Rest der Liste, d.h. L\H, schreibt man dies in Erlang wie folgt:
sum(H|T,N) -> sum(T,H+N)
Da Erlang sehr viel Wert auf Pattern-Matching legt und diese einfach durch ; getrennt werden (die einzelnen Patterns).
Sieht das gesamt Ergebnis wie folgt aus ->
sum(L) -> sum(L,0).
sum([],N) -> N;
sum(H|T,N) -> sum(T,H+N).
Wenn man das ganze in ein Modul mit dem Namen mymath packt, bekommt man ->
-module(mymath).
-export([sum/1,square/1]).
sum(L) -> sum(L,0).
sum([],N) -> N;
sum(H|T,N) -> sum(T,H+N).
square(X) -> X * X.
Habe noch eine Funktion square hinzugefügt, damit ich auch die Summe der Quadrate bilden kann
Na ja, also dann mal kompilieren und ab in die Shell ->
L = { 1,2,3,4,5 }. % Liste definieren punkt nicht vergessen
mymath:sum(L). % Funktionen müssen mit dem Modulnamen vorher aufgerufen werden, soweit ich es momentan verstanden habe
Ergebnis = 15 .... funzt ....
OK, also Listenmodul suchen -> heißt lists ... und dort ist die Funktion map(F,L) definiert, welche die Funktion F auf jedes Element von L anwendet und eine neue Liste zurückgibt....
Nach der Theorie sollte also mymath:sum(lists:map(mymath:square,L)) zum Ziele führen.....
Ergebnis -> * 2: illegal expression
Was die Fehlermeldung bedeutet habe ich noch nicht herausgefunden, aber das es halt nicht geht
Den Workaround, den ich auf die Schnelle gefunden habe, man benutzt eine anonymous Function in Erlang werden die mit Spaß also fun definiert
F = fun(X) -> mymath:square(X) end.
Wenn dann man eingibt in der Shell ->
mymath:sum(lists:map(F,L)).
Ergebnis -> 55 ....
Gruß JJR
Nehmen wir einmal an, wir hätten eine Funktion sum(Liste,Startwert), welche als Ergebnis zurückliefern soll die Summe der Listenelemente + den Startwert .... dann wäre sum(Liste,0) unser gewünschtes Ergebnis, nehme ich mal so an
Die Funktion sum(Liste,Startwert), sollte natürlich Startwert zurückgeben, wenn die Liste leer ist,
dies schreibt man in Erlang so ->
sum([],N) -> N
ist die Liste dagegen nicht leer, und ich bezeichne mit H, dass erste Listenelement und mit T den Rest der Liste, d.h. L\H, schreibt man dies in Erlang wie folgt:
sum(H|T,N) -> sum(T,H+N)
Da Erlang sehr viel Wert auf Pattern-Matching legt und diese einfach durch ; getrennt werden (die einzelnen Patterns).
Sieht das gesamt Ergebnis wie folgt aus ->
sum(L) -> sum(L,0).
sum([],N) -> N;
sum(H|T,N) -> sum(T,H+N).
Wenn man das ganze in ein Modul mit dem Namen mymath packt, bekommt man ->
-module(mymath).
-export([sum/1,square/1]).
sum(L) -> sum(L,0).
sum([],N) -> N;
sum(H|T,N) -> sum(T,H+N).
square(X) -> X * X.
Habe noch eine Funktion square hinzugefügt, damit ich auch die Summe der Quadrate bilden kann
Na ja, also dann mal kompilieren und ab in die Shell ->
L = { 1,2,3,4,5 }. % Liste definieren punkt nicht vergessen
mymath:sum(L). % Funktionen müssen mit dem Modulnamen vorher aufgerufen werden, soweit ich es momentan verstanden habe
Ergebnis = 15 .... funzt ....
OK, also Listenmodul suchen -> heißt lists ... und dort ist die Funktion map(F,L) definiert, welche die Funktion F auf jedes Element von L anwendet und eine neue Liste zurückgibt....
Nach der Theorie sollte also mymath:sum(lists:map(mymath:square,L)) zum Ziele führen.....
Ergebnis -> * 2: illegal expression
Was die Fehlermeldung bedeutet habe ich noch nicht herausgefunden, aber das es halt nicht geht
Den Workaround, den ich auf die Schnelle gefunden habe, man benutzt eine anonymous Function in Erlang werden die mit Spaß also fun definiert
F = fun(X) -> mymath:square(X) end.
Wenn dann man eingibt in der Shell ->
mymath:sum(lists:map(F,L)).
Ergebnis -> 55 ....
Gruß JJR