I database dovrebbero essere visti come Monade?

7

Poiché ogni tipo di aggiornamento / inserimento / eliminazione della persistenza rappresenta in un certo senso una sorta di cambiamento di stato in un database, mi chiedo se i database possano essere considerati monadi. Diciamo la stessa cosa sulle monadi nella programmazione funzionale.

Cosa si può guadagnare o perdere durante la progettazione di un sistema con tale processo di pensiero?

    
posta Gaurav Abbi 18.03.2016 - 16:51
fonte

3 risposte

4

Non proprio.

Un database è una funzionalità per l'archiviazione e il recupero dei dati strutturati e organizzati. Una monade è un modo per comunicare con quel database in un modo che preservi la purezza funzionale.

Pensa alla monade come a un convertitore dal mondo puro, immutabile e matematico del linguaggio di programmazione funzionale; al mondo impuro e mutevole di I / O. Poiché i tuoi effetti mutabili sono sequestrati dietro la monade, puoi "fingere" di vivere ancora in un mondo perfetto e immutabile dall'altra parte della monade.

Ma, alla fine, è ancora solo una monade. Può esserci qualcosa sul lato mutabile di quella monade: un database, una console, un altro computer su cui gira Eliza.

    
risposta data 18.03.2016 - 17:14
fonte
2

Di solito, una Monade rappresenta una sorta di modo di fare calcoli. Ad esempio, Maybe è una monade che consente il fallimento dei calcoli. [] è un calcolo che consente più risultati. IO è una monade che consente la comunicazione con il nebuloso RealWorld .

Un database non è proprio questo. Potresti avere State DataBase , che sarebbe un calcolo con una variabile mutabile (vale a dire, un DataBase ), ma lo stesso DataBase probabilmente non può essere visto come monade.

Cerca return e >>= . Ogni monade ha bisogno di avere questi. I database li hanno?

    
risposta data 18.03.2016 - 17:30
fonte
2

I database sono spesso modellati come monadi nella programmazione funzionale. HaskellDb , Quill , Chiazza di petrolio e Doobie sono alcuni esempi di cui sono a conoscenza. Puoi dire che c'è una differenza tra il database stesso e l'interfaccia di programmazione nel database. Non sono sicuro che sia una distinzione utile in questo contesto.

Più precisamente, una operazione su una tabella del database è spesso modellata come una monade. Quindi la funzione return racchiude una rappresentazione di tabella (come un record o una classe) in un modulo di query interno che può essere utilizzato per ulteriori trasformazioni (prendendo ad esempio record a Query record ). La funzione bind (chiamata >>= in Haskell) trasforma l'azione della query spostata usando la funzione data. Ad esempio, aggiungendo una clausola WHERE alla query.

Poiché la maggior parte dei tipi di raccolta sono anche monadi, ciò consente di trattare tabelle di database come raccolte regolari. Puoi usare le stesse semplificazioni che usi per altre monade: libreria Control.Monad, notazione, comprensione, composizione, ecc. La struttura della tua query è controllata. Se aggiungi macro al mix, come fa Quill, l'SQL può essere generato in fase di compilazione. È un'astrazione abbastanza utile.

    
risposta data 18.03.2016 - 18:23
fonte

Leggi altre domande sui tag