Qual è il termine corretto per una funzione inversa a un costruttore: scartare un valore da un tipo di dati?


13

Modifica: sto riformulando un po 'la domanda. Apparentemente ho creato un po 'di confusione perché non mi rendevo conto che il termine distruttore è usato in OOP per qualcosa di completamente diverso: è una funzione invocata quando un oggetto viene distrutto. Nella programmazione funzionale (proviamo a) evitare lo stato mutabile, quindi non esiste un simile equivalente. (Ho aggiunto il tag corretto alla domanda.)

Invece, ho visto che il campo record per scartare un valore (specialmente per tipi di dati a valore singolo come newtypes) è talvolta chiamato distruttore o forse decostruttore . Ad esempio, abbiamo (in Haskell):

newtype Wrap = Wrap { unwrap :: Int }

Ecco Wrapil costruttore ed unwrapè cosa?

Le domande sono:

  • Come chiamiamo unwrapnella programmazione funzionale? Deconstructor? Distruttore? O con qualche altro termine?
  • E per chiarire, questa / altra terminologia è applicabile ad altri linguaggi funzionali o è utilizzata solo in Haskell?
  • Forse esiste anche una terminologia per questo in generale, in linguaggi non funzionali ?

Ho visto entrambi i termini, ad esempio:

... Molto spesso, uno fornisce costruttori e distruttori intelligenti per facilitare il lavoro con loro. ...

nella wiki di Haskell , o

... Il tema generale qui è quello di fondere il costruttore - coppie di decostruttori come ...

al wikibook di Haskell (qui probabilmente è inteso in senso un po 'più generale), oppure

newtype DList a = DL { unDL :: [a] -> [a] }

La funzione unDL è il nostro decostruttore , che rimuove il costruttore DL. ...

nel mondo reale Haskell .


3
Destruttore sembra essere il termine più usato
Zavior,

3
Questo sembra specializzato per Haskell (un "distruttore" in Haskell non è lo stesso concetto di C ++. La somiglianza dei nomi è fuorviante). Se vuoi il concetto generale di "scartare un valore", probabilmente non dovresti usare Haskell come esempio. In linguaggi simili al C ++, un tale "involucro" può essere semplicemente un getter!
Andres F.

1
Ti suggerisco di rimuovere la parola "distruttore" dalla domanda, utilizzare invece "unwrapper" e chiederti se esiste un nome generale per questo modello in tutte le lingue :)
Andres F.

1
.unapply, o "extractor" è un analogo approssimativo in scala, ma forse non c'è un nome perché nella maggior parte dei casi si esegue semplicemente il pattern match
Gene T

Risposte:


5

Ci sono diversi termini per il concetto. Decostruire è ciò che credo sia comune nei circoli di Haskell, è come lo chiama il mondo reale Haskell. Credo che il termine destructuring (o destructuring bind) sia comune nei circoli di Lisp.


1
Interessante come la stessa cosa ottenga un termine diverso da una lingua all'altra, come la mappa si trasforma in select in C #, haskell ha piega lisp / java ha ridotto e ruby ​​ha iniettato, haskell ha legami scala ha flatmap C # ha selectmany
Jimmy Hoffa

Si chiama infatti decostruzione nei circoli di Haskell. Se sembra strano, tieni presente che Haskell non ha oggetti - solo valori; Quindi è ovvio che il termine ha un significato diverso. La grande parte è che la "decostruzione" è esattamente ciò che fa. In quella nota, penso personalmente che i decostruttori di oggetti debbano essere chiamati qualcosa sulla falsariga di coloro che dispongono gli oggetti. È molto, molto più preciso.
MasterMastic,

8

Distruttore è il termine usato da C ++ e forse da altre lingue che non conosco. Sono utilizzati per rilasciare risorse create dal costruttore in modo che facciano esattamente il contrario. Forse il concetto non si traduce letteralmente in Haskell, ma il termine sembra essere usato in alcuni punti.

EDIT: Considerando la tua modifica alla domanda, la definirei un wrapper quindi ... Sono stato in grado di rispondere alla domanda originale ma ora si è allontanato dalle mie conoscenze, quindi non prendere questa modifica troppo sul serio.


1
Si noti che l'uso di C ++ / C # / Java del termine "distruttore" non corrisponde a quello di Haskell. Stessa parola, concetti diversi.
Andres F.

1
@AndresF. Sì, è per questo che ho aggiunto la frase:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset,

1
Abbastanza giusto, ho rimosso il mio voto negativo. Penso che ciò che è fuorviato sia la vera domanda, che sembra fare una cosa, ma in realtà sta facendo un'altra! :)
Andres F.

@AndresF. Sì, la domanda è fuorviante. Il PO chiede: What's the proper term for a function inverse to a constructor?. A meno che la domanda non sia stata modificata per essere più specifica per alcuni concetti di Haskell, lascerò la mia risposta così com'è.
marco-fiset,

1
Solo una nota, C # ha finalizzatori ma non distruttori, che sono diversi perché i finalizzatori hanno un'esecuzione non deterministica. Quindi forse modifica la tua risposta per non diffondere il termine improprio dei distruttori in C #.
Jimmy Hoffa,

6

In OOP, un costruttore è un costrutto di funzione o linguaggio che crea e inizializza un nuovo oggetto ("costruisce" l'oggetto), e un distruttore è il suo duplice, un costrutto di funzione o linguaggio che pulisce dopo l'oggetto (rilasciando qualsiasi risorsa tiene) e lo elimina.

Tuttavia, poiché Haskell (a differenza, diciamo, C ++) ha la garbage collection e non supporta lo stato mutevole o altri effetti collaterali (almeno non direttamente), non c'è assolutamente alcun motivo per una nozione di distruttore in senso OOP. Inoltre, i costruttori Haskell, a differenza dei costruttori OOP, hanno più applicazioni della semplice creazione di oggetti; sono anche ampiamente utilizzati nella corrispondenza dei modelli (vedi sotto per un esempio).

Nel tuo esempio di codice, 'unwrap' è un campo record e, a seconda di come viene usato, potrei riferirmi ad esso come un accessorio , o forse anche un getter (anche se quest'ultimo è anche usato in un contesto di obiettivo, quindi potrebbe in realtà essere un po 'confuso).

Non ho mai sentito il termine "distruttore" (o "decostruttore") usato personalmente in un contesto di Haskell; come osserva Andres F., tuttavia, viene talvolta utilizzato per fare riferimento a una funzione che annulla il wrapping introdotto da un costruttore. A mio avviso, un registratore di record può fungere da distruttore, ma anche funzioni regolari, a condizione che ottengano un valore da un tipo di dati più complesso. Gli esempi includono maybee eitherdal preludio.

Nota che unwrap, nel tuo esempio, possono essere diverse cose:

  • una funzione (proprio come qualsiasi altra): puoi, per esempio, fare map unwrap [ Wrap 23, Wrap 42 ]; questo utilizzo è approssimativamente equivalente a un metodo getter in OOP.
  • un identificatore di campo record in una costruzione record: let w = Wrap { unwrap = 23 }
  • un identificatore campo record in un record di aggiornamento: let w' = w { unwrap = 23 }; questo è simile ai metodi setter in OOP (se si stringe molto).
  • un identificatore di campo record nella corrispondenza del modello: f Wrap { unwrap = a } = a

Probabilmente è meglio pensare ai costruttori Haskell come qualcosa di completamente diverso dai costruttori OOP. Ti suggerisco di (ri) leggere un buon libro sul linguaggio di programmazione Haskell per una migliore comprensione - "Real World Haskell" è davvero buono, e ho sentito cose positive su "Learn You A Haskell" . Entrambi dovrebbero avere buone spiegazioni sui costruttori e in particolare la sintassi dei record.


2
Prova dell'utilizzo del termine "distruttore" nelle comunità Haskell: haskell.org/pipermail/beginners/2010-April/003946.html e mail-archive.com/haskell-cafe@haskell.org/msg26463.html . Un "distruttore" nel gergo di Haskell è un "involucro", un concetto totalmente estraneo alla gestione della memoria o alla finalizzazione degli oggetti.
Andres F.

3
Il mio direttore della tesi, che programma esclusivamente in Haskell, usa anche il termine "distruttore" per uno scartatore.
Andres F.

Bene, non mi ero mai imbattuto nel termine. Hai assolutamente ragione sul fatto che, se usato, non ha assolutamente nulla a che fare con il concetto di distruttore in OOP.
tdammers,

@AndresF .: modificato per onorare le tue osservazioni.
tdammers,

@AndresF. Questo è interessante in quanto non l'ho mai sentito nominare un distruttore, anche se a parte questo, non sarebbe anche preciso fare riferimento ad esso come un campo record, e la tecnica che vedo chiamata "distruttore" lì come solo una corrispondenza di modello ? Capisco che si chiama "destrutturazione" quando la tua partita sta separando un elenco, è forse un termine correlato ma in riferimento a un ADT? Dopo tutto ciò che distrugge un elenco agisce solo su un ADT poiché è quello che è un elenco. Ho ottenuto il termine destructuring da stackoverflow.com/questions/11677806/…
Jimmy Hoffa,

2

Penso che distruttore sia il termine più ampio. Alcune lingue come Java e VB.NET hanno un finalizzatore. /programming/171952/is-there-a-destructor-for-java


Un distruttore in linguaggi simili a C ++ esegue azioni di pulizia prima di rilasciare memoria allocata. Un distruttore in Haskell toglie un valore dal suo "strato esterno" (non lo usi per ripulire nulla). Non sono concetti veramente correlati.
Andres F.

2
Immagino di non aver capito che questa è una domanda di Haskel.
JeffO,

In verità non era chiaro. La domanda è stata ora rinominata e riformulata :)
Andres F.

2

Dal momento che non sembra esserci alcuna convenzione inter-lingua, di solito li chiamo estrattori , perché questo è il termine che Scala usa per quella nozione generale e perché non è probabile che venga confuso con alcun uso esistente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.