Frage

Ich alberte mit einigen funktionalen Programmierung um, wenn ich über die Notwendigkeit dieser Funktion kam, aber ich weiß nicht, was diese Art der Sache in der Standardnomenklatur bezeichnet wird. Jeder erkennt es?

function WhatAmIDoing(args...)
   return function()
       return args
   end
end

Edit: die Funktion verallgemeinert, dauert es eine variable Menge von Argumenten (oder vielleicht eine implizite Liste) und gibt eine Funktion, dass beim Aufruf gibt alle args, so etwas wie ein Curry oder Gurke, aber es scheint nicht zu sein.

War es hilfreich?

Lösung

WhatAmIDoing ist ein Funktion höherer Ordnung , weil es eine Funktion, die eine andere Funktion zurückgibt.

Die Sache, dass es wieder ein thunk - ein Verschluss für eine verzögerte Berechnung des Geschaffenen tatsächlicher Wert. Normalerweise Thunks werden erstellt, um gemächlich einen Ausdruck auswerten (und möglicherweise es memoize), aber in anderen Fällen eine Funktion einfach anstelle eines bloßen Wert benötigt wird, wie im Fall von „constantly 5“, die in einigen Sprachen eine Funktion zurückgibt, immer wieder 5.

Die letztere in dem Beispiel angewendet werden könnte gegeben, weil unter der Annahme, die Sprache in applikativer auswertet, um (dh wertet Argumente vor Aufruf einer Funktion) dient die Funktion keinen anderen Zweck als die Werte in eine Funktion zu aktivieren, die sie zurückgibt.

WhatAmIDoing ist wirklich eine Implementierung der „ständig“ Funktion, die ich beschreiben. Aber im Allgemeinen, Sie müssen nicht in der inneren Funktion nur args zurückzukehren. Sie könnten zurückkehren „ackermann(args)“, das eine lange Zeit in Anspruch nehmen könnte, wie in ...

function WhatAmIDoing2(args...)
   return function()
       return ackermann(args)
   end
end

Aber WhatAmIDoing2 würde sofort wieder da Auswertung der ackermann Funktion würde in einem Schließung rel="nofollow href="http://en.wikipedia.org/wiki/Closure_(computer_science)" ausgesetzt . (Ja, auch in einer Call-by-Wert Sprache.)

Andere Tipps

In der funktionalen Programmierung eine Funktion, die eine andere Funktion als Argument oder gibt eine andere Funktion aufgerufen wird, eine höher- Bestellfunktion .

Ich würde sagen, dass XXXX eine Schließung der unbenannte Funktion gibt auf den Werten von x, y und z gebunden ist.

Das wikipedia Artikel kann etwas Licht

Currying ist über eine Funktion an eine Kette von Funktionen umsetzen, wobei jeweils nur einen Parameter und zurückkehren andere solche Funktion. Also, dieses Beispiel hat keine Beziehung zu currying.

Abbeizen ist ein Begriff ususally verwendet, um eine Art von Serialisierung zu bezeichnen. Vielleicht ein Objekt zum Speichern von mehreren Werten aufgebaut.

Wenn der Aspekt für Sie interessant ist, dass die zurückgegebene Funktion der Argumente der XXXX-Funktion zugreifen kann, dann würde ich mit Remo.D gehen.

Wie andere gesagt haben, es ist ein Funktion höherer Ordnung . Wie Sie „Muster“ in Ihrer Frage, ich dachte ich, dass diese Funktion von funktionalen Sprachen hinzufügen würde oft die Strategie Muster in Sprachen ohne Funktionen höherer Ordnung.

Etwas sehr ähnlich constantly in Clojure genannt wird:

http://github.com /richhickey/clojure/blob/ab6fc90d56bfb3b969ed84058e1b3a4b30faa400/src/clj/clojure/core.clj#L1096

Nur die Funktion, die Renditen constantly nimmt eine beliebige Anzahl von Argumenten, so dass es allgemein (und flexible) als Ihr Muster.

Ich weiß nicht, ob dieses Muster einen Namen hat, aber wäre es in Fällen verwenden, in denen normalerweise Funktionen zu erwarten sind, aber alles, was ich ist egal, dass ein bestimmte Wert zurückgegeben:

(map (constantly 9) [1 2 3])
=> (9 9 9) 

Einfach fragen, was tun Sie das?

Ein Delegierter?

Grundsätzlich Sie zurückgeben eine Funktion ?? oder die Ausgabe einer Funktion?

Haben Sie nicht verstehen, sorry ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top