Domanda

Stavo scherzando con qualche programmazione funzionale quando mi sono imbattuto nella necessità di questa funzione, tuttavia non so come si chiama questo genere di cose nella nomenclatura standard. Qualcuno lo riconosce?

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

Modifica: generalizza la funzione, accetta una quantità variabile di argomenti (o forse un elenco implicito) e restituisce una funzione che quando viene invocata restituisce tutti gli argomenti, qualcosa come un curry o un sottaceto, ma non sembra neanche.

È stato utile?

Soluzione

WhatAmIDoing è una funzione di ordine superiore perché è una funzione che restituisce un'altra funzione.

La cosa che restituisce è un thunk & # 8212; una chiusura creata per il calcolo ritardato del valore effettivo. Di solito i thunk vengono creati per valutare pigramente un'espressione (e possibilmente memorizzarla), ma in altri casi è semplicemente necessaria una funzione al posto di un valore non elaborato, come nel caso di " costantemente 5 " ; che in alcune lingue restituisce una funzione che restituisce sempre 5.

Quest'ultimo potrebbe applicarsi nell'esempio dato, poiché supponendo che il linguaggio valuti in ordine applicativo (cioè valuti gli argomenti prima di chiamare una funzione), la funzione non ha altro scopo se non quello di trasformare i valori in una funzione che li restituisce.

WhatAmIDoing è in realtà un'implementazione del "costantemente" funzione che stavo descrivendo. Ma in generale, non è necessario restituire solo args nella funzione interna. Puoi restituire " ackermann (args) " ;, che potrebbe richiedere molto tempo, come in ...

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

Ma WhatAmIDoing2 ritornerebbe immediatamente perché la valutazione della funzione ackermann sarebbe sospesa in una chiusura . (Sì, anche in una lingua chiamata per valore.)

Altri suggerimenti

Nella programmazione funzionale una funzione che accetta un'altra funzione come argomento o restituisce un'altra funzione è chiamata higher- funzione ordine .

Direi che XXXX restituisce una chiusura della funzione senza nome legata ai valori di x, ye z.

Questo wikipedia potrebbe far luce

Currying riguarda la trasformazione di una funzione in una catena di funzioni, ciascuna delle quali accetta solo un parametro e restituendo un'altra tale funzione. Quindi, questo esempio non ha alcuna relazione con il curry.

Decapaggio è un termine usato abitualmente per indicare un tipo di serializzazione. Forse per memorizzare un oggetto creato da più valori.

Se l'aspetto interessante per te è che la funzione restituita può accedere agli argomenti della funzione XXXX, allora andrei con Remo.D.

Come altri hanno già detto, è una funzione di ordine superiore . Come hai " modello " nella tua domanda, ho pensato di aggiungere che questa caratteristica dei linguaggi funzionali è spesso modellata usando il modello di strategia in lingue senza funzioni di ordine superiore.

Qualcosa di molto simile è chiamato costantemente in Clojure:

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

Solo la funzione che costantemente accetta una quantità arbitraria di argomenti, rendendola più generale (e flessibile) del tuo modello.

Non so se questo modello ha un nome, ma lo userei nei casi in cui normalmente sono previste funzioni, ma tutto ciò a cui tengo è che venga restituito un certo valore:

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

Mi chiedo, per cosa usi questo?

Un delegato?

In pratica stai restituendo una funzione ?? o l'output di una funzione?

Non ho capito, scusa ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top