Tudo bem se eu decidir escrever todo o meu Ruby como se fosse Haskell?


10

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 eachfamí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 ...


13
Por que não escrever apenas em Haskell?

11
Eu escreveria apenas em Haskell, mas Ruby não é tão ruim que mereça ser jogado fora completamente. Gosto do fato de poder usá-lo durante a criação de scripts e, para as muitas experiências rápidas, gosto de invadir ao aprender coisas sobre IA. Mas, provavelmente, também porque eu só comecei a aprender Haskell, pode seguir-lhe conselhos, eventualmente :-)
nemesisfixx

2
Não entendo por que você está pedindo a permissão do Stack Overflow. Se você estiver escrevendo um código que compartilhará com outras pessoas em uma equipe, precisará coordenar seus estilos de codificação de qualquer maneira. Caso contrário, o que isso importa?
Mike Daniels

Por que estou perguntando SO? porque respeito a opinião honesta de hackers e programadores experientes. Pode haver benefícios em usar uma abordagem de funcionalidade pura para programação que mentes experientes possam compartilhar comigo (e outras pessoas como eu).
Nemesisfixx

Considerando que há razões objetivas para "não", essa é uma pergunta legítima.
Andrew Grimm

Respostas:


16

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 :

def in_order(xs):
    for i in range(1,len(xs)):
        if xs[i] > xs[i+1]:
            return False
    return True

inOrder :: (Ord a) => [a] -> Bool
inOrder xs = and $ zipWith (<=) xs (tail xs)

Escrever in_orderda 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.


De alguma forma, sua descrição me fez pensar em pascal.
precisa saber é o seguinte

@rasjani, oh? Alguma razão para isso?

Eu não sei, talvez seja a falta de compreensão do inglês ou o que você descreveu se encaixa em como (pelo menos) as coisas eram organizadas / organizadas em unidades pascal. Apenas um tipo de conexão mental, não pode ter qualquer conexão real tu devido a primeira opção;)
rasjani

11
A afirmação "espaço linear em vez do espaço constante de Haskell devido à preguiça" não é precisa. Preguiça ainda implica ordem linear. Eu entendo o seu ponto, no entanto.

3
@aromero, eu não entendo o seu, no entanto. O que a ordem tem a ver com isso? Espaço constante vem do lixo de Haskell, coletando os cabeçalhos da lista de comparações após andconsumi-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ógico andveja alguma delas (a menos que você use geradores ... o que eu acho que é uma possibilidade).

7

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.


1

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.


Em um dos meus testes Smalltalk: 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).
Frank Shearar 8/07

0

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.


0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.