Já me disseram em perguntas anteriores que as linguagens de programação funcional não são adequadas para sistemas dinâmicos, como um mecanismo de física, principalmente porque é caro modificar objetos. Quão realista é essa afirmação e por quê?
Já me disseram em perguntas anteriores que as linguagens de programação funcional não são adequadas para sistemas dinâmicos, como um mecanismo de física, principalmente porque é caro modificar objetos. Quão realista é essa afirmação e por quê?
Respostas:
Tanto Haskell quanto Clojure permitem mutabilidade real, portanto, isso não é um problema para começar.
Além disso, se seus dados "mutáveis" consistirem em valores intermediários sendo atualizados gradualmente como parte de algum cálculo maior, talvez você nem precise da mutabilidade para ser eficiente! Por exemplo, há pesquisas em andamento em Haskell sobre uma técnica chamada fusão de fluxo , em que o compilador funde loops de processamento, produtores de dados e consumidores de dados para eliminar completamente as estruturas intermediárias de dados.
O principal problema com Haskell aqui é a preguiça - em um programa de processamento de números em que você tem muitos dados de entrada e muitos dados de saída e tudo isso é importante, a preguiça oferece muito poucos benefícios, mas ainda impõe alguma sobrecarga. Isso não quer dizer que você não possa escrever programas como esse em Haskell (na verdade, as pessoas fazem), mas não está jogando com os pontos fortes da linguagem e você precisa entender melhor o modelo de avaliação para obter o desempenho desejado.
Dito isto, o processamento pesado de números também não contribui para os pontos fortes da JVM. Esse tipo de programa é o motivo pelo qual o FORTRAN ainda está por aí.
Não posso falar por Clojure, mas posso dizer que o Haskell tem muitos pacotes de E / S altamente sintonizados disponíveis que permitirão toda a mutação que você desejar.
Aqui está uma resposta para uma pergunta que eu escrevi em que alguém detalha os três mais comuns e considera seu desempenho: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286
Você também pode ver aqui um gráfico simples que mostra as métricas de desempenho de um servidor da Web haskell chamado Warp, que é um aplicativo altamente intensivo de IO.
Há muita confusão sobre isso em relação ao Haskell, a verdade é que ele possui instalações fantásticas de E / S com muitos pacotes no hackage para usar o IO de várias maneiras diferentes, muitas das quais foram altamente ajustadas. A razão pela qual as pessoas presumem que esse não é o caso é porque Haskell se esforça bastante para separar a IO de todo o resto, mas isso não afeta as características de desempenho.
Agora, para falar sobre as características de desempenho, no entanto, a razão pela qual as pessoas o reconhecem como tendo um desempenho ruim deve-se à avaliação preguiçosa que faz com que ele se comporte de maneiras que nem sempre são intuitivas. No entanto, é algo com que você deve se preocupar consideravelmente menos quando começa a trabalhar em um contexto de E / S, fazendo atualizações destrutivas, como em um sistema ao qual você está se referindo. Outras pessoas tendem a achar que, quando estão tendo problemas de desempenho, as instalações integradas para instrumentar e identificar para onde os recursos estão indo ajudam muito.
Outra mônada que vale a pena procurar por um sistema como você descreve seria a mônada ST, que é especificamente para atualizações destrutivas feitas por chamadas de E / S muito pequenas, proporcionando excelente desempenho.
Desculpe, eu realmente não posso falar com Clojure, espero que alguém possa dar detalhes lá.
Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases