Ich werde mit Julia veranschaulichen:Funktionale Programmierung: Sind Karten sequenziell? Folgen für Verschlüsse
Angenommen, ich habe eine Funktion counter(), die eine Schließung ist.
function mycl()
state=0
function counter()
state=state+1
end
end
Jetzt nehme ich die Funktion mycoutner erstellen:
mycounter=mycl()
und Karte jetzt diese Funktion über ein Array der Länge 10, wobei alle Elemente 1.
map(x->x+mycounter(),ones(1:10))
Der Ausgang zu sein, ist wie folgt:
julia> map(x->x+mycounter(),ones(1:10))
10-element Array{Int64,1}:
2
3
4
5
6
7
8
9
10
11
Es scheint, dass die Funktion sequenziell auf das zu mappende Array angewendet wird.
Letztendlich versuche ich für for-Schleifen zu vermeiden, aber mit der lokalen Statusvariable der Schließung muting Zustand, ich brauche dies nacheinander angewendet werden. Dies scheint der Fall zu sein, ist das ein angenommener Standard? (habe die äquivalente R-Version nicht mit * apply getestet). Und ist das wirklich "funktional", weil die lokale Zustandsvariable mutiert?
Dies ist der Fall mit Karte. Wenn Sie stattdessen mit pmap versuchen, sehen Sie, dass Ihre Ausgabe etwa [2 2 2 2 2 3 3 3 4 4] usw. ist, abhängig von der Anzahl der von Ihnen definierten Prozesse. Und, ja, wenn Ihre Funktion einen Zustand hat, ist sie nicht funktional und die Ausgabe ist in diesem Fall völlig unvorhersehbar. –
Sie sollten 'reduce' /' fold' (wie auch immer es in Julia heißt) für Dinge verwenden, die sequentiell erledigt werden müssen, nicht 'map'. Der Zweck von 'map' ist, einen neuen Container zu erstellen, keine Nebenwirkungen auszuführen. – Bergi