Em uma resposta a esta pergunta (escrita por Pete), existem algumas considerações sobre POO versus PF. Em particular, sugere-se que as linguagens FP não sejam muito adequadas para modelar objetos (persistentes) que tenham uma identidade e um estado mutável.
Eu queria saber se isso é verdade ou, em outras palavras, como modelar objetos em uma linguagem de programação funcional. Pelo meu conhecimento básico de Haskell, pensei que alguém poderia usar mônadas de alguma forma, mas realmente não sei o suficiente sobre esse tópico para encontrar uma resposta clara.
Então, como as entidades com uma identidade e um estado persistente mutável normalmente são modeladas em uma linguagem funcional?
Aqui estão alguns detalhes adicionais para esclarecer o que tenho em mente. Pegue um aplicativo Java típico no qual eu possa (1) ler um registro de uma tabela de banco de dados em um objeto Java, (2) modificar o objeto de maneiras diferentes, (3) salvar o objeto modificado no banco de dados.
Como isso seria implementado, por exemplo, em Haskell? Inicialmente, eu lia o registro em um valor de registro (definido por uma definição de dados), realizava diferentes transformações aplicando funções a esse valor inicial (cada valor intermediário é uma nova cópia modificada do registro original) e depois escrevia o valor final do registro para o banco de dados.
Isso é tudo o que existe? Como posso garantir que, a cada momento, apenas uma cópia do registro seja válida / acessível? Não se deseja que diferentes valores imutáveis representem diferentes instantâneos do mesmo objeto para serem acessíveis ao mesmo tempo.