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

13

Modifica: sto riformulando la domanda un po '. Apparentemente ho causato un po 'di confusione perché non mi ero reso conto che il termine distruttore è usato in OOP per qualcosa di abbastanza diverso - è una funzione invocata quando un oggetto viene distrutto. Nella programmazione funzionale noi (proviamo a) evitiamo lo stato mutevole, 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 newtype s) è talvolta chiamato destructor o forse deconstructor . Ad esempio, abbiamo (in Haskell):

newtype Wrap = Wrap { unwrap :: Int }

Qui Wrap è il costruttore e unwrap è cosa?

Le domande sono:

  • Come chiamiamo unwrap nella programmazione funzionale? Deconstructor? Distruttore? O con qualche altro termine?
  • E per chiarire, è questa / altra terminologia applicabile ad altri linguaggi funzionali , oppure è usata solo nell'Haskell?
  • Forse anche, esiste una terminologia per questo in generale, nelle lingue non funzionali ?

Ho visto entrambi i termini, ad esempio:

... Most often, one supplies smart constructors and destructors for these to ease working with them. ...

Haskell wiki , o

... The general theme here is to fuse constructor - deconstructor pairs like ...

a Haskell wikibook (qui probabilmente è inteso in un senso un po 'più generale), o

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

The unDL function is our deconstructor, which removes the DL constructor. ...

in Il mondo reale Haskell .

    
posta Petr Pudlák 12.10.2012 - 14:18
fonte

5 risposte

5

Esistono diversi termini per il concetto. Decostruire è ciò che ritengo sia comune nei circoli Haskell, è ciò che lo chiama Real World Haskell. Credo che il termine destrutturazione (o legame distruttivo) sia comune nei cerchi Lisp.

    
risposta data 12.10.2012 - 17:19
fonte
8

Destructor è il termine usato da C ++ e forse da altre lingue che non conosco. Sono usati per rilasciare risorse create dal costruttore in modo che facciano esattamente l'opposto di esso. 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 unwrapper, quindi ... Sono stato in grado di rispondere alla domanda originale, ma ora si è allontanato dalla mia conoscenza, quindi non prendere questa modifica troppo sul serio. / p>     

risposta data 12.10.2012 - 14:26
fonte
6

In OOP, un costruttore è una costruzione di linguaggio o funzione che crea e inizializza un nuovo oggetto ("costruisce" l'oggetto) e un distruttore è il suo duale, una costruzione di linguaggio o funzione che ripulisce dopo l'oggetto (rilasciando qualsiasi risorsa che detiene) e la elimina.

Tuttavia, dal momento che Haskell (a differenza, per esempio, C ++) ha garbage collection e non supporta lo stato mutabile o altri effetti collaterali (almeno non direttamente), non c'è assolutamente alcun motivo per una nozione di distruttore nel senso OOP. Inoltre, i costruttori di Haskell, a differenza dei costruttori OOP, hanno più applicazioni della semplice creazione di oggetti; sono anche molto usati nella corrispondenza dei pattern (vedi sotto per un esempio).

Nel tuo esempio di codice, 'unwrap' è un campo di record e, a seconda di come viene usato, potrei riferirmi come accessor , o forse anche un getter (sebbene quest'ultimo sia usato anche nel contesto di una lente, quindi potrebbe effettivamente essere un po 'confuso).

Non ho mai sentito il termine "distruttore" (o "decostruttore") usato in un contesto di Haskell; come osserva Andres F., tuttavia, a volte è usato per riferirsi a una funzione che annulla il wrapping introdotto da un costruttore. A mio modo di vedere, un getter di record può servire da distruttore, ma potrebbe svolgere anche funzioni regolari, a condizione che recuperino un valore da un tipo di dati più complesso. Gli esempi includono maybe e either dal Preludio.

Tieni presente che unwrap , nel tuo esempio, può essere di diverse cose:

  • una funzione (come qualsiasi altra): puoi, ad esempio, fare map unwrap [ Wrap 23, Wrap 42 ] ; questo utilizzo è approssimativamente equivalente a un metodo getter in OOP.
  • uno specificatore campo record in una costruzione record: let w = Wrap { unwrap = 23 }
  • un identificatore di campo record in un aggiornamento del record: let w' = w { unwrap = 23 } ; questo è simile ai metodi setter in OOP (se spremiti molto).
  • un identificatore di campo record nell'abbinamento di pattern: 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" è veramente buono, e ho sentito cose positive su "Learn You A Haskell" . Entrambi dovrebbero avere buone spiegazioni sui costruttori e registrare la sintassi in particolare.

    
risposta data 12.10.2012 - 16:17
fonte
2

Penso che il distruttore sia il termine più ampio. Alcuni linguaggi come Java e VB.NET hanno un finalizzatore. link

    
risposta data 12.10.2012 - 14:28
fonte
2

Dal momento che non sembra esserci alcuna convenzione cross-language, di solito li chiamo extractors , perché è il termine usato da Scala per quella nozione generale, e perché non è probabile che sia confuso con qualsiasi utilizzo esistente.

    
risposta data 12.10.2012 - 21:04
fonte

Leggi altre domande sui tag