Sim, o FP pode ser usado em aplicativos corporativos. Clojure é um exemplo de linguagem FP com sucesso na empresa: http://cognitect.com/clojure#successstories
Representar estado pode ser um desafio no PF e mudar paradigmas para se ajustar ao FP pode ser um pouco complicado. Alguns idiomas FP impedem completamente os efeitos colaterais e o estado mutável. O Clojure permite, mas desencoraja ou isola esses paradigmas.
Em resumo, a representação do estado pode ser muito semelhante à OO. É uma modificação de estado que é muito diferente. Por exemplo, no estado FP, pode ser representado por listas e mapas. Uma lista de funcionários pode se parecer com:
[[name: "James Brown" address: "Barnwell, SC"]
[name: "Elvis Presley" address: "Tupelo, MS"]]
Conheço duas maneiras de lidar com a modificação de estado no FP. Um é algo como programação reativa funcional. Nesse paradigma, todo estado é tratado apenas no nível mais alto ... por exemplo, uma visualização HTML do seu aplicativo possui um estado na visualização (como o nome da pessoa, endereço etc.). Agora, quando você clica em "atualizar nome", é chamada uma função que lida com tudo sobre uma atualização de nome, exceto a alteração do nome. Isso pode parecer estranho ... mas tenha paciência comigo. O nome alterado será retornado pela função e a exibição (ou armazenamento de dados persistente etc.) mostrará o novo nome. Ou, alternativamente, uma nova estrutura inteira com o nome atualizado será retornada. Então, o que a função faz? Ele valida o nome e retorna o novo nome, se for válido, um erro se não for, e possivelmente uma nova visualização ou link de navegação a seguir. Para algo mais complexo do que uma mudança de nome, pode fazer muito mais.
Portanto, para o FRP, o objeto retornado pela função é o novo estado e pode ser fornecido diretamente para a exibição ou o que estiver no nível alto. Em alguns casos, o FRP leva o estado inteiro para a função e recupera todo o estado.
Com esse paradigma, o contêiner ou estrutura precisa lidar com a atualização da exibição, banco de dados ou qualquer outra coisa que precise ser atualizada a partir do novo estado. Então você pode imaginar uma estrutura que desenha o aplicativo na tela. Quando um usuário clica em algo, as funções são invocadas e o novo estado é retornado. A estrutura atualiza a tela redesenhando tudo ou redesenhando partes da tela de maneira inteligente. Consulte http://blog.getprismatic.com/om-sweet-om-high-functional-frontend-engineering-with-clojurescript-and-react/
Clojure usa o segundo paradigma que me deparei e que é isolar as mudanças de estado, mas não necessariamente restringi-las ao nível mais alto. Com o Clojure, todo estado mutável deve ser "mantido" (a menos que você esteja usando objetos Java para estado) por um átomo, agente ou referência. A maneira como isso funciona é o objeto mantido ou apontado ou referenciado (como você deseja chamá-lo) pelo atom / agent / ref é imutável, mas o atom / agent / ref pode mudar para apontar para um novo objeto. Nesse caso, você usa métodos especiais no atom / agent / ref que dizem "atualize o objeto aqui fazendo isso e aquilo e reatribuindo o atom / agent / ref para um novo objeto".
Por que isso é benéfico, você pode perguntar? Como o objeto imutável referido por essas construções Clojure pode ser passado para uma função que faz alguma coisa e enquanto essa função está em execução, sua referência ao objeto é garantida para não mudar. Ou seja, o átomo / agente / ref não é passado para a função, mas o objeto imutável apontado por eles é passado. Átomos, agentes e refs têm propriedades especiais que lidam com atualizações e simultaneidade de maneiras seguras e parte do idioma. Veja http://clojure.org/state
Eu espero que isso ajude. Sugiro ler mais sobre o estado de Clojure e o FRP para entender melhor como os funcionários e pessoas podem ser representados no FP. No entanto, a representação real seria semelhante à programação orientada a objetos ... é a mutabilidade que é realmente diferente.