2009-12-07 1 views
8

Ist es möglich, Funktion mit Argumentliste variabler Länge zu definieren?Variable Länge der Funktionsargumentliste in Erlang

Ich weiß, dass ich schreiben kann einfach:

function() -> function([]). 
function(X) when not is_list(X) -> function([X]); 
function(X) -> do_something_with_arguments(X). 

Aber ich will diese Technik vermeiden.

Antwort

8

Eine Möglichkeit, es zu tun ist, alle Argumente in einer Liste übergeben:

function(ListOfParameters)

und dann können Sie über das sagte ListOfParameters laufen. Auf diese Weise können Sie Ihre Funktionsdeklaration in die Lage versetzen, eine beliebige Anzahl von "Parametern" zu akzeptieren, fügen Sie einfach weitere Begriffe zu der Deklaration hinzu ... aber ich bin nicht sicher, ob Sie das gehofft haben. Denken Sie an eine Parameterliste von C ? Im positiven Fall lesen Sie den nächsten Absatz.

Sie müssen daran denken, dass Erlang auf Mustervergleich basiert. Die Argumente in der Funktion "Deklaration" dienen als übereinstimmendes Muster, wenn eine Funktion aufgerufen wird. Sie müssen lassen Sie Ihre "procedural Programmierung" Denkweise beiseite, um Erlangs Macht voll nutzbar zu machen.

+0

Der erste Teil Ihrer Antwort ist das gleiche wie Technik wie ich erwähnte, ich dachte über etwas ähnlich wie C, also lese ich zweiten Teil, so dass ich jetzt auf meine erste Lösung zurückgreifen muss. Danke für die Antwort! –

+0

Mein Vergnügen! Viel Spaß mit Erlang! – jldupont

+0

Was wäre das Beste, wenn Sie eine variable Liste von Argumenten hätten, und dann müssten Sie eine andere Funktion ausführen, während Sie die Variablenliste der Argumente an diese andere Funktion übergeben würden? – CMCDragonkai

8

Um viel expliziter zu sein als @jldupont: Nein!

Es ist nicht, dass es gerade nicht implementiert wurde, aber in Erlang Funktionen mit dem gleichen Namen, aber unterschiedliche Anzahl von Argumenten werden als verschiedene Funktionen betrachtet, so dass es nicht hinzugefügt werden kann.

+0

Gibt es eine Möglichkeit, eine Liste von Argumenten aufzuteilen und jedes Argument auf eine Funktion anzuwenden? – CMCDragonkai

+0

@CMCDragonkai Sie meinen, wenden Sie die gleiche Funktion für jedes Element an? Zu diesem Zweck: 'lists: map' oder list comprehensions, um eine Ergebnisliste zu erhalten; oder 'lists: foldl', um die Rückgabewerte in den Aufruf des nächsten Elements in der Liste einzufügen. – rvirding

+0

Eigentlich, wenn eine Liste von Argumenten gegeben wird, möchte ich eine andere Funktion aufrufen und die Liste als die Menge der Argumente übergeben. In Elixir gibt es 'apply'. – CMCDragonkai