Sí, FP se puede usar en aplicaciones empresariales. Clojure es un ejemplo de lenguaje FP con éxito en empresas: http://cognitect.com/clojure#successstories
Representar al estado puede ser un desafío en la PF y cambiar los paradigmas para adaptarse a la PF puede ser un poco retorcido. Algunos lenguajes FP no permiten por completo los efectos secundarios y el estado mutable. Clojure permite ambos, pero desalienta o aísla esos paradigmas.
En resumen, la representación estatal puede ser muy similar a OO. La modificación del estado es muy diferente. Así, por ejemplo, en el estado FP puede estar representado por listas y mapas. Una lista de empleados puede verse así:
[[name: "James Brown" address: "Barnwell, SC"]
[name: "Elvis Presley" address: "Tupelo, MS"]]
Hay dos maneras que conozco para manejar la modificación de estado en FP. Uno es algo así como la programación funcional reactiva. En este paradigma, todo el estado se maneja en el nivel más alto solo ... por ejemplo, una vista HTML de su aplicación tiene estado en la vista (como el nombre de la persona, la dirección, etc.). Ahora, cuando hace clic en "actualizar nombre", se llama a una función que maneja todo lo relacionado con una actualización de nombre, excepto cambiar el nombre. Esto puede sonar extraño ... pero ten paciencia conmigo. La función devolverá el nombre cambiado y la vista (o almacén de datos persistente, etc.) mostrará el nuevo nombre. O, alternativamente, se devolverá una estructura completamente nueva con el nombre actualizado. Entonces, ¿qué hace la función? Valida el nombre y devuelve el nuevo nombre si es válido, un error si no lo es, y posiblemente una nueva vista o enlace de navegación para seguir. Para algo más complejo que un cambio de nombre, puede hacer mucho más.
Entonces, para FRP, el objeto devuelto por la función es el nuevo estado y se puede dar directamente a la vista o lo que sea que esté en el nivel superior. En algunos casos, FRP toma todo el estado, lo pasa a la función y recupera todo el estado.
Con este paradigma, el contenedor o el marco deben manejar la actualización de la pantalla, la base de datos o cualquier otra cosa que necesite actualizarse desde el nuevo estado. Entonces puede imaginar un marco que dibuje la aplicación en la pantalla. Cuando un usuario hace clic en algo, se invocan funciones y se devuelve el nuevo estado. Luego, el marco actualiza la pantalla al volver a dibujar todo o al volver a dibujar de manera inteligente partes de la pantalla. Ver http://blog.getprismatic.com/om-sweet-om-high-functional-frontend-engineering-with-clojurescript-and-react/
Clojure usa el segundo paradigma que he encontrado y es aislar los cambios de estado, pero no necesariamente restringirlos al nivel más alto. Con Clojure, un átomo, agente o referencia debe "retener" todo el estado mutable (a menos que esté utilizando objetos Java para el estado). La forma en que esto funciona es el objeto sostenido o señalado o referenciado (como quiera llamarlo) por el átomo / agente / ref es inmutable, pero el átomo / agente / ref puede cambiar para apuntar a un nuevo objeto. En este caso, utiliza métodos especiales en el átomo / agente / referencia que dicen "actualice el objeto aquí haciendo tal y tal y reasignando el átomo / agente / referencia a un nuevo objeto".
¿Por qué es tan beneficioso que puedas preguntar? Debido a que el objeto inmutable al que hacen referencia estas construcciones de Clojure puede pasarse a una función que hace algo y mientras esa función se está ejecutando, se garantiza que su referencia al objeto no cambia. Es decir, el átomo / agente / ref no se pasa a la función pero se pasa el objeto inmutable al que apuntan. Los átomos, los agentes y los árbitros tienen propiedades especiales que manejan las actualizaciones y la concurrencia de manera segura y parte del lenguaje. Ver http://clojure.org/state
Espero que esto ayude. Sugiero leer más sobre el estado de Clojure y FRP para comprender mejor cómo los empleados y las personas pueden ser representados en FP. Sin embargo, la representación real sería similar a la programación orientada a objetos ... es la mutabilidad lo que es realmente diferente.