2010-05-07 13 views
22

Il seguente metodo è Pure? Direi che, dato che non cambia in ogni caso la classe corrente, quindi, tutto ciò che ora possiamo "vedere" in classe, prima di eseguire questo metodo sarà esattamente lo stesso dopo. Ho ragione?Domanda sui metodi [Pure]

class Set { 
    ... 
    public ISet<T> UnionWith(ISet<T> set) { 
     ISet<T> unionSet = ... 

     foreach (Element element in this) { 
      unionSet.Add(element); 
     } 

     foreach (Element element in set) { 
      unionSet.Add(element); 
     } 

     return unionSet; 
    } 
} 
+0

Forse stai cercando il termine * idempotente *? –

+0

Hmmm ... non proprio. –

+0

Nota che (concettualmente) è importante considerare il tuo livello di astrazione quando pensi se una funzione è pura. In effetti è puro oggetto-saggio, perché non cambia lo stato di qualsiasi oggetto presente (eccetto quello nuovo), ma non è puramente di sistema - alloca la memoria, quindi cambia lo stato del sistema. – Kos

risposta

31

Se per [Pure] intendi etichettato con l'attributo Pure dal System.Diagnostics.Contracts, la documentazione dice:

metodi puri non fanno alcun visibile cambiamenti di stato.

Poiché il metodo sembra non apportare modifiche allo stato visibile (ovvero senza effetti collaterali), si qualificherebbe per l'attributo [Pure].

+1

Esiste una definizione di "puro" a cui il suo metodo non è conforme, comunque? Per quanto posso vedere, è anche matematicamente puro - produrrà sempre lo stesso output dato lo stesso input ('questo 'contando come input), e non cambierà in alcun modo lo stato del sistema generale. –

+1

Pavel: alcune definizioni di "puro" richiedono che gli input siano immutabili. Considera una funzione wrapper che memoizes una funzione di input se è pura. Se il Set può cambiare senza che il wrapper ne sia a conoscenza, si potrebbe dire che UnionWith non è "abbastanza puro" da memoize con un wrapper. – Gabe

+0

Nel momento in cui ho fatto la domanda c'era una risposta che affermava che non lo era, utilizzando una definizione pura diversa dai Contratti di codice di C#. Ma il suo autore lo ha successivamente cancellato. L'idea era che se in momenti diversi passassi lo stesso ISet alla mia classe, dato che gli elementi della mia classe potrebbero essere diversi in momenti diversi, ottieni diversi output, quindi la tua funzione non è pura. http://en.wikipedia.org/wiki/Pure_function –

Problemi correlati