Dado que o Ruby possui bons recursos de operação de lista embutidos - reduza, mapeie, selecione, colete etc. Ele possui Procs, Blocks e Lambdas, e possui um bom suporte de iteração (a each
família), seria uma má decisão de projeto se eu tentar escrever todas as minhas coisas de Ruby da maneira mais pura e funcional possível? Especialmente para código que possui pouca ou nenhuma E / S (efeitos colaterais menos óbvios)?
Eu tenho aprendido Haskell (chamado de 'hacker' real '') e estou apaixonada por sua maneira de fazer as coisas - eu amo Ruby, mas acho que pode ser ainda mais divertido quando mais espírito Haskell flui para ele (bem, não Ruby pede emprestado / aprende muito com ele em primeiro lugar?)
Orientação construtiva é bem-vinda ...
ruby
haskell
functional-programming
nemesisfixx
fonte
fonte
Respostas:
Eu tenho feito isso com python. Acho que é complicado escrever em um estilo funcional hereditariamente puro em um idioma que não foi projetado para isso. Por exemplo, compare as duas definições de in_order :
Escrever
in_order
da maneira Haskell em python será tanto detalhado (como o python não suporta muito bem os idiomas necessários) quanto lento (espaço linear em vez do espaço constante de Haskell devido à preguiça).No entanto, tive sucesso ao criar programas python com organização funcional e uma implementação idiomática de cada função. A ideia de que essa é uma boa maneira de programar é na verdade a tese por trás do meu projeto de catálogo de códigos . Portanto, meus componentes são orientados em torno de abstrações e funções (com interface pura ) operando neles, em vez de classes com estado, e estão se unindo perfeitamente. De fato, o código organizado dessa maneira parece ser mais flexível para reutilizar do que o código organizado com classes. No entanto, isso poderia ser um viés pessoal, já que eu ainda sou um devoto de Haskell.
Então, eu diria que a resposta para sua pergunta é meio . Use suas raízes funcionais para ajudá-lo a pensar, mas não exagere. Por exemplo. simular listas preguiçosas no Ruby apenas por causa do idioma provavelmente será mais complicado do que vale a pena.
fonte
and
consumi-los; ele se comportará como um loop. Considerando que a lista de comparações do python terá que ser gerada na íntegra antes que o analógicoand
veja alguma delas (a menos que você use geradores ... o que eu acho que é uma possibilidade).Você pode escrever código Ruby em estilo funcional como se fosse Scheme, não Haskell. Para escrevê-lo como se fosse Haskell, seria necessário um sistema do tipo Haskell, além de uma avaliação preguiçosa generalizada.
fonte
Eu descobri que entender a programação funcional, e Haskell em particular, é útil para mim em certas situações que encontrei no Ruby. Mas quanto mais aprendo Haskell, mais percebo o quão longe Ruby está de ser capaz de se parecer com Haskell.
A situação de carregamento do módulo / código é péssima, por um lado. O intérprete atual não tem a otimização de chamada de cauda ativada; portanto, você não pode usar a recursão da mesma forma que em Haskell. E quando você entra no Monads, não há realmente nenhuma comparação dos níveis de abstração que você pode alcançar em Haskell vs. Ruby.
Se você estiver interessado, eu tenho postado algum código de comparação Ruby / Haskell no gist.github.com, como eu estou aprendendo.
A técnica que eu trouxe para Ruby, que funcionou melhor, foi encontrar funções puras onde posso, que é o que parece que você está tentando fazer.
fonte
self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g])
. Não há nenhuma razão para você não usar conscientemente mônadas, em vez de usá-las sem nem mesmo saber que as está usando (como listas).Eu diria "sim". O que (acho) você está falando é sobre a influência da programação funcional na linguagem ruby. O paradigma funcional possui alguns conceitos realmente agradáveis que complementam ou se sobrepõem ao orientado a objetos (sem efeitos colaterais, em particular).
A grande vantagem do ruby é que ele permite que você codifique em um estilo linear, orientado a objetos ou funcional, ou alguma mistura deles. E seu script simples e linear pode se transformar no estilo OO / funcional se e quando sua complexidade aumentar.
fonte
Depende se você estará colaborando com outras pessoas. Se você estiver trabalhando no código sozinho, use qualquer estilo com o qual se sinta mais confortável. No entanto, se você estiver trabalhando com outros programadores Ruby, eles não podem ser usados para um estilo de programação puramente funcional e, portanto, ficar confusos com o seu código. Por outro lado, se seus colaboradores também forem programadores Haskell que migraram para o Ruby, você pode não ter esse problema.
fonte