Sì, FP può essere utilizzato nelle applicazioni aziendali. Clojure è un esempio di un linguaggio FP con successo nell'impresa: link
Rappresentare lo stato può essere una sfida in FP e cambiare i paradigmi per adattarli a FP può essere un po 'una distorsione mentale. Alcuni linguaggi FP non consentono completamente di disabilitare gli effetti collaterali e lo stato mutabile. Clojure consente entrambi ma scoraggia o isola questi paradigmi.
In breve, la rappresentazione dello stato potrebbe essere molto simile a OO. La modifica dello stato è molto diversa. Quindi, ad esempio, nello stato FP può essere rappresentato da liste e mappe. Un elenco di dipendenti può essere simile a:
[[name: "James Brown" address: "Barnwell, SC"]
[name: "Elvis Presley" address: "Tupelo, MS"]]
Ci sono due modi in cui so di gestire la modifica dello stato in FP. Uno è qualcosa di simile alla programmazione reattiva funzionale. In questo paradigma tutto lo stato viene gestito solo al massimo livello ... ad esempio, una vista HTML della tua applicazione ha uno stato nella vista (come il nome della persona, l'indirizzo, ecc.). Ora quando si fa clic su "Aggiorna nome" viene chiamata una funzione che gestisce ogni cosa relativa ad un aggiornamento del nome, tranne che in realtà cambia il nome. Può sembrare strano ... ma avere pazienza con me. Il nome modificato verrebbe quindi restituito dalla funzione e la vista (o l'archivio dati persistente, ecc.) Mostrerà il nuovo nome. Oppure, in alternativa, verrà restituita un'intera nuova struttura con il nome aggiornato. Quindi, cosa fa la funzione? Convalida il nome e restituisce il nuovo nome se è valido, un errore se non lo è, ed eventualmente una nuova vista o un link di navigazione da seguire. Per qualcosa di più complesso di un cambio di nome, potrebbe fare molto di più.
Quindi per FRP l'oggetto restituito dalla funzione è il nuovo stato e può essere assegnato direttamente alla vista o qualunque cosa sia al livello alto. In alcuni casi, FRP prende tutto lo stato passa alla funzione e restituisce l'intero stato.
Con questo paradigma, il contenitore o il framework deve gestire l'aggiornamento della visualizzazione, del database o di qualsiasi altra cosa che richiede l'aggiornamento dal nuovo stato. Quindi puoi immaginare un quadro che disegna l'applicazione sullo schermo. Quando un utente fa clic su qualcosa vengono invocate le funzioni e viene restituito il nuovo stato. Il framework aggiorna lo schermo ridisegnando tutto o rielaborando in modo intelligente le parti del display. Vedi link
Clojure utilizza il secondo paradigma che ho trovato e cioè quello di isolare i cambiamenti di stato ma non necessariamente li limita al massimo livello. Con Clojure tutto lo stato mutabile deve essere "tenuto" (a meno che tu non stia usando oggetti Java per lo stato) da un atomo, agente o riferimento. Il modo in cui funziona è l'oggetto trattenuto o puntato o referenziato (comunque lo si voglia chiamare) da atomo / agente / rif è immutabile, ma l'atomo / agente / riferimento può cambiare per puntare a un nuovo oggetto. In questo caso si usano metodi speciali sull'atomo / agente / ref che dicono "aggiorna l'oggetto qui eseguendo tale e così e riassegnando l'atomo / l'agente / il riferimento a un nuovo oggetto".
Perché è vantaggioso chiedere? Poiché l'oggetto immutabile referenziato da questi costrutti Clojure può essere passato a una funzione che fa qualcosa e mentre quella funzione sta eseguendo il suo riferimento all'oggetto è garantito che non cambi. Cioè, l'atomo / agente / rif non viene passato alla funzione ma l'oggetto immutabile a cui si riferisce viene passato. Atomi, agenti e ref hanno proprietà speciali che gestiscono aggiornamenti e concorrenza in modo sicuro e parte della lingua. Vedi link
Spero che questo aiuti. Suggerisco di leggere di più sullo stato di Clojure e su FRP per capire meglio come dipendenti e persone possono essere rappresentati in FP. Tuttavia, la rappresentazione effettiva sarebbe simile alla programmazione orientata agli oggetti ... è la mutabilità che è davvero diversa.