Perché i dati derivati mutabili essenziali hanno una funzione inversa?

4

Stavo leggendo il documento Out of the Tar Pit scritto da Ben Moseley e Peter Marks quando mi sono imbattuto la seguente sezione a pagina 25 relativa ai dati derivati mutabili essenziali:

Essential Derived Data — Mutable

As with immutable essential derived data, this can be excluded (and the data re-derived on demand) and hence corresponds to accidental state.

Mutability of derived data makes sense only where the function (logic) used to derive the data has an inverse (otherwise — given its mutability — the data cannot be considered derived on an ongoing basis, and it is effectively input). An inverse often exists where the derived data represents simple restructurings of the input data. In this situation modifications to the data can simply be treated identically to the corresponding modifications to the existing essential state.

Non capisco perché i dati derivati mutabili essenziali debbano avere una funzione inversa. Ad esempio, considera il seguente codice JavaScript:

inputbox.onchange = function () {
    outputbox.value = md5(inputbox.value);
};

Qui inputbox.value è input nel sistema e outputbox.value è il dato derivato mutabile essenziale. È derivato da inputbox.value usando la funzione md5 . Tuttavia la funzione md5 non ha un inverso. Tuttavia inputbox.value è ancora essenziale, mutabile e derivato.

Quindi cosa significano realmente gli autori quando affermano che "la mutabilità dei dati derivati ha senso solo dove la funzione (logica) usata per derivare i dati ha un inverso (altrimenti - data la sua mutabilità - i dati non possono essere considerati derivato su base continuativa, ed è efficace input ) "?

Hai qualche esempio per chiarire il loro punto?

    
posta Aadit M Shah 20.04.2014 - 12:49
fonte

2 risposte

4

Quando dicono dati derivati immutabili, pensa al valore derivato come sempre calcolato da una funzione, quindi l'output non viene mai modificato tranne che come risultato della modifica dell'ingresso per prima. In altre parole, se si dispone di una GUI con una casella di input e una casella di output derivata, quella casella di output sarebbe di sola lettura. La funzione è immutabile, anche se il suo input non lo è.

Per il tuo esempio di md5, dato che non è invertibile, non cambierai mai il valore md5 nella GUI e ricaverai nuovi dati di input da quello. Devi cambiare i dati di input. Se non si desidera memorizzare quell'input (ad esempio se si tratta di una password), i dati md5 devono diventare un input dopo che è stato calcolato.

Per un esempio di dati derivati mutabili , considera un selettore di colori che mostra sia le rappresentazioni rgb che hsv di un colore, ma lo memorizza come rgb. L'hsv può essere considerato come dati derivati, ma non ha bisogno di essere immutabile perché ha un inverso. Se si modifica direttamente il valore hsv, è possibile ottenere un valore rgb da questo come input.

    
risposta data 20.04.2014 - 17:14
fonte
1

Non essendo gli autori, posso solo indovinare, ma penso che stiano accennando alla differenza tra i dati mutabili e time-variant . Se l'utente può effettivamente modificare outputbox.value arbitrariamente, allora è veramente mutabile, ma non è anche dato derivato (usa solo i dati derivati come valore predefinito di ordinamento). Se, d'altra parte, outputbox.value cambia da solo in tandem con inputbox.value , ma l'utente non può cambiarlo direttamente , allora non è più mutabile ma sostituisce il tempo.

Un buon esempio di dati che è sia realmente mutabile che derivato veramente è il cosiddetto views . Immaginiamo di avere una struttura dati complicata ed efficiente per archiviare la lista di un certo tipo di valore, ma vogliamo che gli utenti siano in grado di usarla come se fosse una normale matrice mutabile. Potremmo specificare un numero qualsiasi di operazioni utili sui dati, ma alla fine il modo più semplice è esporre un array come dati mutabili derivati : in altre parole, permettiamo agli utenti di convertire la nostra struttura dati a un array, e quindi quando cambiano l'array, cambiamo la struttura dei dati in tandem . Questo è ciò che si intende per dati mutabili derivati aventi un "inverso"; se volessi essere un po 'più matematicamente preciso, potrei chiamarlo adjoint .

La differenza tra i dati mutabili e i dati time-variant è fondamentale e costituisce il cuore di gran parte della confusione dei nuovi arrivati a Programmazione reattiva funzionale . Se sei interessato a questo genere di cose, ti consiglio vivamente di consultare Elm , in particolare questa panoramica di alto livello di FRP .

    
risposta data 20.04.2014 - 13:19
fonte