Sì, FP può essere utilizzato in applicazioni aziendali. Clojure è un esempio di linguaggio FP con successo nelle imprese: http://cognitect.com/clojure#successstories
Rappresentare lo stato può essere una sfida in FP e cambiare i paradigmi per adattarlo a FP può essere un po 'una distorsione mentale. Alcuni linguaggi FP non consentono completamente gli effetti collaterali e lo stato mutevole. Clojure permette entrambi ma scoraggia o isola quei paradigmi.
In breve, la rappresentazione statale può essere molto simile a OO. La modifica dello stato è molto diversa. Quindi, ad esempio, nello stato FP può essere rappresentato da elenchi e mappe. Un elenco di dipendenti può apparire come:
[[name: "James Brown" address: "Barnwell, SC"]
[name: "Elvis Presley" address: "Tupelo, MS"]]
Ci sono due modi che conosco per gestire la modifica dello stato in FP. Uno è qualcosa come la programmazione reattiva funzionale. In questo paradigma tutto lo stato viene gestito solo al massimo livello ... ad esempio, una vista HTML dell'applicazione ha uno stato nella vista (come il nome, l'indirizzo della persona, ecc.). Ora, quando si fa clic su "aggiorna nome", viene chiamata una funzione che gestisce tutto ciò che riguarda un aggiornamento del nome, tranne che la modifica del nome. Può sembrare strano ... ma abbi pazienza. Il nome modificato verrà quindi restituito dalla funzione e la vista (o 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 in caso contrario, e possibilmente una nuova vista o collegamento 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 dato direttamente alla vista o qualunque cosa sia ad alto livello. In alcuni casi FRP prende l'intero stato e lo passa alla funzione e ripristina l'intero stato.
Con questo paradigma, il contenitore o il framework deve gestire l'aggiornamento del display, del database o di qualsiasi altra cosa necessiti l'aggiornamento dal nuovo stato. Quindi puoi immaginare un framework 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 quindi aggiorna lo schermo ridisegnando tutto o ridisegnando in modo intelligente parti del display. Vedi http://blog.getprismatic.com/om-sweet-om-high-functional-frontend-engineering-with-clojurescript-and-react/
Clojure usa il secondo paradigma che ho incontrato e cioè isolare i cambiamenti di stato ma non necessariamente limitarli al livello più alto. Con Clojure tutto lo stato mutabile deve essere "trattenuto" (a meno che non si utilizzino oggetti Java per stato) da un atomo, un agente o un riferimento. Il modo in cui funziona è l'oggetto trattenuto o puntato o referenziato (comunque tu voglia chiamarlo) dall'atomo / agente / ref è immutabile, ma l'atomo / agent / ref può cambiare per puntare a un nuovo oggetto. In questo caso usi metodi speciali sull'atomo / agente / ref che dicono "aggiorna qui l'oggetto facendo questo e così e riassegnando l'atomo / agente / ref a un nuovo oggetto".
Perché è utile chiedere questo? Perché l'oggetto immutabile a cui fanno riferimento questi costrutti di Clojure può essere passato a una funzione che fa qualcosa e mentre quella funzione sta eseguendo il suo riferimento all'oggetto è garantito che non cambierà. Cioè, l'atomo / agente / ref non viene passato alla funzione ma viene passato l'oggetto immutabile a cui punta. Atomi, agenti e ref hanno proprietà speciali che gestiscono aggiornamenti e concorrenza in modi sicuri e parte del linguaggio. Vedi http://clojure.org/state
Spero che questo possa essere d'aiuto. Suggerisco di leggere di più sullo stato di Clojure e FRP per comprendere meglio come dipendenti e persone possono essere rappresentati in FP. Tuttavia, la rappresentazione reale sarebbe simile alla programmazione orientata agli oggetti ... è la mutabilità che è davvero diversa.