Sinto-me à vontade com a programação em C e C # e explorarei o C ++ no futuro. Eu posso estar interessado em explorar a programação funcional como um paradigma de programação diferente. Estou fazendo isso por diversão, meu trabalho não envolve programação de computadores e sou um pouco inspirado pelo uso de programação funcional, ensinada bastante cedo, em cursos de ciência da computação na faculdade. O cálculo lambda certamente está além das minhas habilidades matemáticas, mas acho que posso lidar com programação funcional.
Qual de Haskell ou Scheme serviria como uma boa introdução à programação funcional? Eu uso o emacs como meu editor de texto e gostaria de configurá-lo mais facilmente no futuro, o que implicaria o aprendizado do Emacs Lisp. Meu entendimento, no entanto, é que o Emacs Lisp é bastante diferente do Scheme e também é mais processual do que funcional.
Eu provavelmente usaria o livro "The Little Schemer", que eu já comprei, se eu prosseguir com o Scheme (me parece um pouco estranho por causa de minha folga limitada). Ou usaria o "Aprenda um Haskell para o Bem", se eu perseguir Haskell. Também assistia aos vídeos Introdução ao Haskell do Dr. Erik Meijer no Canal 9.
Todas as sugestões, comentários ou sugestões são bem-vindas.
Obrigado.
PS BTW Também tenho acesso ao F #, pois tenho o Visual Studio 2010, que uso no desenvolvimento de C #, mas não acho que esse seja o meu principal critério para selecionar um idioma.
Real World Haskell
Respostas:
Eu recomendaria OCaml.
Do meu ponto de vista pessoal, a principal base das programações funcionais modernas são as funções de ordem superior, um sistema de tipos estáticos, tipos de dados algébricos e correspondência de padrões.
Entre um esquema, um ML e um Haskell, eu escolheria o ML porque acho que é o mais relevante para essa definição. O esquema não possui digitação estática (existe o Typed Racket, mas não é para os iniciantes), e Haskell tem muitas outras coisas (mônadas, avaliação preguiçosa ...) que, embora interessantes, podem desviar a atenção da base importante .
SML e OCaml são igualmente interessantes; Estou mais acostumado ao OCaml, e ele tem uma sensação mais "prática" que é boa (mas se você realmente quer "prática" com o risco de perder sua alma, pode também escolher F #).
Scheme e Haskell também são linguagens muito interessantes. A ênfase do esquema nas macros é interessante, mas não está diretamente relacionada à programação funcional (é outra das coisas que você deve definitivamente tentar no mundo, além de programação lógica, linguagens baseadas em pilha e E orientado a recursos).
Haskell é definitivamente uma ótima linguagem e, eu acho, um ponto obrigatório para os aspirantes a gurus da programação funcional. Mas como as principais linguagens do OCaml e do Haskell são muito semelhantes (exceto para uma avaliação lenta que distrai o iniciante), é fácil aprender o Haskell depois de conhecer os conceitos básicos do OCaml. Ou melhor, você pode se concentrar nas coisas estranhas e não precisa assimilar o básico ao mesmo tempo.
Da mesma forma, depois de ver o OCaml, e possivelmente também o Haskell, e ainda assim querer saber mais, você deve consultar Coq ou Agda. No entanto, poucos recomendariam a Coq ou a Agda para uma primeira introdução à programação funcional ...
Para esclarecer minha questão: acho que aprender OCaml (ou SML) e Haskell o tornará um programador funcional tão bom quanto aprender Haskell diretamente, mas mais facilmente (ou menos dolorosamente).
Além disso, OCaml e Haskell têm coisas boas que os diferenciam, e é interessante saber sobre os recursos avançados de ambos . Apenas aprender Haskell é mais pobre nesse aspecto (embora, é claro, você possa aprender OCaml depois de Haskell; acho que é menos lógico e o deixará mais frustrado).
Para aprender o OCaml, eu recomendaria o rascunho do livro de Jason Hickey (PDF) .
¹ esta definição é controversa. Algumas pessoas do esquema alegam que a digitação estática não tem nada a ver com a programação funcional. Algumas pessoas de Haskell alegam que sua definição de pureza ("o que Haskell faz, mas não mais") é uma condição sine qua non por ser uma linguagem funcional. Eu concordo em discordar.
fonte
Se você estiver interessado nos conceitos mais avançados em programação funcional, vá com Haskell. Existe um sistema de tipos adequado e uma proibição estrita contra mutações. Ainda assim, Haskell não é para os fracos de coração.
Se você quer apenas uma introdução ao design funcional, vá em Scheme. A sintaxe é muito mais fácil de aprender e ler. Ele permite a programação procedural, mas apenas se disciplina para não usar nenhum procedimento com a
!
no final do nome.Com o Scheme, você também pode ler a Estrutura e a Interpretação de Programas de Computador , que é a melhor introdução aos paradigmas de programação. Existem palestras sobre o livro, tanto do MIT quanto de Berkeley .
fonte
A resposta correta é, é claro, ambas! Portanto, é apenas uma questão de qual idioma abordar primeiro. Minha situação é idêntica à sua. Eu realmente gostei imensamente de The Little Schemer. Definitivamente, você entenderá as construções básicas da programação funcional depois de passar por isso (e terá um lugar para colocar suas manchas de geléia!)
Estou cerca de um quarto em Learn You a Haskell for Great good. Também estou gostando um pouco, mas os dois livros não poderiam ser mais diferentes. Aprenda um Haskell tem uma abordagem muito tradicional para ensinar um idioma específico. O Little Schemer é específico do Scheme, obviamente, mas está muito mais preocupado em ensinar os fundamentos da programação funcional, não a linguagem do Scheme.
Definitivamente, recomendo começar com The Little Schemer. É menos prático, mas mais fundamental.
fonte
Meus dois centavos em relação à programação funcional é não ficar preso a uma linguagem específica, mas aprender os principais conceitos da programação funcional. Aprendi programação funcional sendo lançado de cabeça para um projeto em que meu chefe insistia em que todo o desenvolvimento fosse feito no APL. O APL é uma linguagem de processamento de matriz funcional e está o mais longe possível do LISP, Haskell ou de qualquer outra linguagem de programação convencional. A verdadeira recompensa foi quando descobri que depois de "grudar" o paradigma de programação funcional e mentalmente aprender a decompor automaticamente um problema em um programa funcional, eu realmente não estava mais intimidado pelos aspectos idiomáticos de outras linguagens funcionais como Haskell, OCaml, Scheme, Scala e Clojure. EU'
Se eu escolhesse uma primeira linguagem funcional, provavelmente escolheria Haskell ou Steel Bank Common Lisp (SBCL). Para Haskell, eu lia Learn You a Haskell ... , Mundo Real Haskell , The Haskell Road to Logic, Maths and Programming e Pearls of Functional Algorithm Design . Para CL, eu li Land of Lisp , Paradigmas de Programação de Inteligência Artificial e (se você é realmente hardcore) Let over Lambda . Você pode misturar e combinar todos esses livros para obter uma ampla visão geral de abordagens e conceitos práticos de programação funcional.
Eu também consideraria aprender Clojure e Scala, já que são linguagens funcionais muito boas e muito expressivas por si só (apesar do que os puristas de FP possam dizer).
fonte
Concordo com o ponto "aprender os dois", mas há mais alguns pontos que não foram mencionados até agora. Antes de tudo, se você é iniciante em programação funcional e gosta de Haskell, precisa enfrentar várias coisas novas, além do FP: precisa aprender a viver em um ambiente preguiçoso, o que pode exigir um esforço considerável e você precisa para lidar com um sistema do tipo "real" que pode estar muito longe do que você usa em C ou C #.
O esquema, OTOH, tem uma sintaxe de aparência estrangeira, mas não existe um sistema de tipo estático para aprender, e é uma linguagem rigorosa para que as coisas sejam mais familiares. Além disso, as implementações de esquemas tendem a ser muito maleáveis - por exemplo, Racket leva isso ao extremo e fornece uma variante preguiçosa e outra estaticamente tipada. Isso significa que você pode começar com as coisas "fáceis" e aprender a usar uma linguagem funcional; depois, você pode crescer e usar a variante digitada e a preguiçosa. Eles devem ser mais fáceis agora, já que você consegue lidar com um recurso de cada vez. Para ser claro, os conceitosserá novo o suficiente para que a questão sintática seja menor e principalmente irrelevante. Em outras palavras, quando você começar a conhecer os novos conceitos, estará ocupado o suficiente para que a sintaxe desapareça. (E se você realmente se importa com a sintaxe, a sintaxe de Haskell é algo que eu pessoalmente considero muito elegante - mas é porque também está muito longe da sintaxe C / C # / C ++ média.)
Mas, tendo dito tudo isso, acho que também há um bom ponto para o F # - você diz que faz isso como uma coisa paralela, mas quando aprende FP, em breve você vai querer usar todas essas coisas boas. Usar o F # significa que você pode fazer mais coisas "reais", já que provavelmente é fácil lidar com o mesmo tipo de problemas com os quais você lida em seu trabalho diário. Idealmente, você chegará a um ponto em que veria a vantagem de usá-lo, digamos, em C # - e usá-lo em algum projeto. Portanto, enquanto você estiver certo em não escolher o F # apenas porque é mais fácil de acessar, considere-o, pois não há nada melhor do que realmente usaresses novos conceitos. Por outro lado, se você usa o Scheme ou o Haskell e o considera uma linguagem de brinquedo para seu objetivo (mesmo que você saiba que algumas pessoas o usam para aplicativos reais), nunca levará a coisa toda do FP muito a sério. [Mas YMMV, é principalmente baseado em observações subjetivas e pode variar muito de uma pessoa para outra.]
fonte
Existe alguma razão para o ML não ser uma das suas opções? Existe uma boa quantidade de material introdutório disponível, incluindo livros e apostilas. Se você gosta de The Little Schemer, também poderá gostar de The Little MLer. Por fim, você pode facilmente fazer a transição para o F # posteriormente. (Não que eu esteja batendo em Haskell ou Scheme - idealmente, aprenda todos os três).
Além disso, uma palavra de aviso sobre o Emacs Lisp. Não acho que Haskell ou ML o preparem para isso. Uma linguagem Lispy como Scheme ajudará, mas ainda existem grandes diferenças, por exemplo. variáveis de escopo dinâmico. As extensões do Emacs, por sua própria natureza, tendem a ser mais imperativas do que funcionais - elas têm tudo a ver com alterar o estado do editor.
fonte
Escreva para si mesmo um esquema em 48 horas (em haskell)
Eu realmente recomendo isso. Você aprenderá Haskell usando um problema real e interessante e aprenderá a melhor lição de esquema ao brincar com o intérprete que você criar. Se você seguir esse caminho, mantenha algumas boas apresentações sobre Haskell. Você os entenderá melhor se tiver um problema a resolver.
fonte
Eu iria com Haskell. No esquema, você pode ser pressionado a executar procedimentos, e seu sistema de tipos não é tão útil quanto o de Haskell, o que é ótimo para iniciantes, pois verifica se o seu código está correto no momento da compilação.
fonte
Eu acho que é fácil se envolver em debates sobre idiomas e não entender. Para alguém que quer apenas aprender sobre o que é FP, as diferenças entre Ocaml / ML / Scheme / Haskell não são tão importantes quanto o seu conforto com o material (livros, vídeos, ferramentas) que você usa para aprendê-lo. E se você tem ou não um amigo para ajudá-lo a aprender um determinado idioma, supera todo o resto.
fonte
Se não é puro, você também pode usar uma linguagem imperativa, então Haskell.
fonte
Em uma das respostas que você recebeu à sua pergunta, achei este link bastante interessante, pois fornece uma amostra de Haskell e Scheme.
Além desse link bacana, aqui está minha opinião sobre sua pergunta.
Se você tem um histórico imprescindível de programação, pode acabar se esforçando bastante para aprender a programação funcional. Eu garantiria que a experiência de aprendizado não estivesse vazia. Ou seja, você pode aplicá-lo ao seu emprego atual ou próximo ou que o ajudará de alguma outra maneira.
Existem muitas línguas boas por aí. O povo Scala exaltaria sua língua, assim como o pessoal de Clojure e CL. Até os pythonistas afirmam preguiça. Outras pessoas que responderam sugeriram ML. Amit Rathore que escreveu Clojure in Action, pode até sugerir que você aprenda Haskell.
Você mencionou Windows e F #. Isso o ajudará em sua posição atual? Eu não sei nada sobre F #. É funcional o suficiente? Eu pergunto isso, porque o IMHO Python tem construções funcionais, mas não é como programar no Clojure.
Para resumir, aprenda uma linguagem funcional que seja "realmente" funcional e, ao fazer isso, faça mais sentido para a sua situação.
fonte
Do ponto de vista de um iniciante, sugiro não começar com o SICP se você decidir sobre o esquema, a menos que sua matemática esteja bem madura. O livro e os vídeos estão cheios de sutilezas e não são nada intuitivos para alguém que está começando.
fonte