Comentários
- E F # e Clojure.
Resposta
Eu sugiro aprender ambos, Haskell primeiro, depois Common Lisp. Minha experiência com Haskell foi que a digitação estática parecia ser um aborrecimento restritivo no início, mas quando me acostumei, percebi que a maioria dos meus erros de tipo tinham erros lógicos ocultos por trás deles. Quando você chegar a este ponto, e ao próximo marco, que é aprender a pensar em tipos e definir seus próprios tipos como um meio de expressar sua solução, você estará pronto para Common Lisp.
Com Common Lisp, você pode adicionar mônadas, currying e tudo o que gostou de Haskell, mas também obtém herança múltipla, como Frank Shearar mencionou, e funções genéricas com envio múltiplo e um sistema avançado de tratamento de exceções. não apenas aprender Common Lisp primeiro? Vindo de uma experiência procedural e OOP, minha experiência tem sido que eu não entendi realmente programação funcional até que tive que usá-la exclusivamente. Uma vez que a programação funcional esteja confortável, você pode adicionar o resto das ferramentas que o Common Lisp disponibiliza e usar a ferramenta que for melhor para a tarefa em questão.
Comentários
- Acho que você acertou em cheio – o que torna Haskell e Smalltalk tão úteis para o aprendizado é sua pureza.
- I concordar com a pureza torna o aprendizado de um idioma muito mais fácil. Não consegui ' não entender a linguagem funcional em si com o LISP porque tudo é possível na linguagem e eu tenho muitos antecedentes imperativos e OO. Mas em Haskell, não existem tais conceitos que interrompam o aprendizado.
- É ' é engraçado, eu ' ve teve a experiência oposta. Eu aprendi os principais pontos da programação funcional por meio do Scheme, minha primeira linguagem. Ocasionalmente hackear Haskell e inevitavelmente descobrir que tenho que reaprender 90% + das coisas que eu sabia sempre que deixo Haskell por um tempo. Dito isso, Haskell é uma linguagem incrivelmente rica, com muito a lhe ensinar (de maneira muito convincente). Tipos Tipos Tipos Tipos! Siga os tipos!
Resposta
E por favor.
Haskell ensina o mais puro de FP, pelo menos que eu saiba, assim como Smalltalk ensina o mais puro de OO. (Menciono isso não para sugerir que OO e FP não podem se casar, mas porque essas duas linguagens são linguagens “preciosas” – um ideia central levada ao extremo.)
Lisp é realmente uma família de linguagens, então falarei sobre Common Lisp porque esse é o membro específico da família que eu uso.
Lisp ainda terá muito a lhe ensinar:
- É multiparadigma, então como dsimcha aponta , ele “mostrará a você como integrar FP com outros paradigmas.
- Lisp irá lhe ensinar que “código é dado, dado é código”, por exemplo através de suas macros.
- CLOS é um marca muito interessante de OO, com herança múltipla que funciona e funções genéricas.
Resposta
Haskell e Lisp são duas bestas totalmente diferentes.
Haskell é uma espécie de “programação funcional pura em uma torre de marfim”
Lisp é uma espécie de “code-is-data / data-is-code / faça suas próprias construções de linguagem”. Você pode manipular seu código de qualquer maneira que você possa imaginar.
Eles são muito diferentes. Ambos compartilham o aspecto de “programação funcional”, mas esse é realmente um pequeno ponto em comum em comparação com suas diferenças. Basta experimentá-los e você verá como são diferentes!
Comentários
- +1: Bom argumento. Eu conheço alguns Haskell e alguns Lisp. Mesmo não sendo um especialista em nenhum deles, acho que você está certo ao dizer que eles são muito diferentes. Em Haskell, você não tenho a ideia de usar dados como código. Em Lisp você não tem correspondência de padrões (AFAIK). Provavelmente a lista (!) de diferenças é mais longa.
Resposta
Aprender Lisp mais tarde permitirá que você personalize o Emacs, que sem dúvida é o editor de texto mais avançado disponível. Você não pode fazer isso em Haskell.
Comentários
- [Aumenta os parênteses]
- Talvez alguém possa escrever um editor de texto para isso. Ouvi dizer que o sistema operacional Emacs não ' não vem com um. (Eu estou brincando. Eu sei que você pode obter o modo Viper. 🙂
- Na verdade, existe um clone do Emacs chamado Yi, que usa Haskell exatamente da mesma maneira que o Emacs usa Lisp.Na verdade, comparado ao (GNU) Emacs, Yi é ainda mais puro, porque seu kernel também é escrito em Haskell, enquanto os kernels Emacs geralmente tendem a não ser escritos em Lisp. GNU Emacs ' kernel é escrito em C, JEmacs ' é escrito em Java, por exemplo.
- @J ö rg, se for uma reimplementação parcial ao invés de um clone completo do GNU Emacs ou XEmacs, não é a mesma coisa. Semelhante a comparar o Word com o Wordpad ou Bloco de notas.
- @Thorbj ø rn Ravn Andersen: Sim, mas não exatamente tão ruim. 🙂
Resposta
O principal benefício que vejo em aprender Lisp é aprender como integrar FP em um ambiente real – linguagem multiparadigmática voltada para o mundo, em vez de apenas aprendê-la no contexto de uma linguagem acadêmica que enfatiza a pureza.
Comentários
- Acho que você quer uma " Haskell vs Lisp " guerra!
- Haskell é uma linguagem acadêmica que enfatiza a pureza … e muitas pessoas o usam no mundo real. Smalltalk ' s nesse campo também.
- Muitas pessoas usam Haskell no mundo real?
- @Jon Harrop: Bem, eu uso Haskell no mundo real (e funciona muito bem para certos aplicativos), talvez eu seja um dos poucos (?)
Resposta
Eu também tenho experiência em C / C ++ / Python e experimentei o FP algumas vezes nos últimos anos. Inicialmente olhei para Haskell e não consegui decifrá-lo, então tentei Ocaml, mas não fui muito longe com isso. Finalmente comecei a ouvir coisas boas sobre Scala, experimentei e descobri que me servia muito bem (eu também tinha feito um pouco de Java no passado), a tal ponto que, depois de um ano de experiência em Scala (e despachando 161 Problemas do Projeto Euler com isso), Haskell parece fazer muito mais sentido. Na verdade, acabei de encomendar alguns livros sobre Haskell e quero tentar novamente, embora isso seja amplamente motivado pela existência de Scalaz.
Então, descobri o uso de uma linguagem multiparadigma (ou seja, Scala, mas Lisp provavelmente também serviria), um bom caminho para o FP. Mas se você está feliz em mergulhar em Haskell (eu não estava), vá em frente.
Comentários
- Interessante que você tenha ido mais longe com Scala do que OCaml. Por quê?
- @Jon: Boa pergunta; difícil de dizer. Talvez eu não estivesse ' t pronto para " entrar em " funcional naquele momento. Talvez por acaso eu encontrei um tutorial do Scala no nível certo. Talvez a linhagem C / C ++ / Java de Scala ' a tenha tornado um pouco menos estranha. Dada qualquer aposta racional hoje em dia seria em F # ao invés de Scala, eu ' provavelmente revisitarei o domínio OCaml em algum ponto, embora já que eu me envolva nessas coisas apenas pela pura alegria de entrando em uma " mentalidade de programação " diferente do meu dayjob C ++, tenho uma inclinação perversa para tentar novamente Haskell novamente na próxima.
- Abordagem de movimento suave 🙂
Resposta
Eu originalmente vim de um background C / C ++ / Ruby e usei conceitos FP em Ruby sempre que podia. Estado meio que machucou meu cérebro. Um dos meus amigos me ligou um dia e me pediu para escrever algo em Haskell (meu primeiro – e espero que não o último – trabalho em Haskell!). Aprendi o idioma rapidamente e juntei algo que funcionou. Não era bonito nem nada, mas funcionou.
Tirei um mês de folga de Haskell porque não tinha nada para usar. Mas quando decidi que precisava escrever meu próprio software de blog, usei Haskell ( https://symer.io ). Haskell é muito legal porque você pode dividir um problema em partes e implementar essas partes de maneira diferente com base nas informações fornecidas. Haskell também lida com falhas extremamente bem por meio de encaixe inteligente de valores. Existem tantas ferramentas para trabalhar com essas caixas que você simplesmente esquece que elas existem.
Minha experiência com lisp (Scheme) foi completamente negativa. Não apenas a linguagem carecia dessas ferramentas simples e inteligentes, como também parecia tão perigosamente solta quanto Ruby ou JavaScript. Foi uma experiência horrível e não oferece nada de novo além de Ruby ou Python.
C ++ não se compara a Haskell, fora do gerenciamento de memória. Haskell é tão rápido (se não mais rápido), significativamente mais conciso e muito mais seguro. Mas a segurança de Haskell nunca entra em ação o caminho.
TL; TR Haskell é uma lufada de ar fresco e Lisp é um Ruby ligeiramente mais funcional.