Scheme vs Haskell para uma Introdução à Programação Funcional?


36

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.


3
Não se esqueçaReal World Haskell
alternativa

15
Comentário secundário: o cálculo lambda é um sistema extraordinariamente simples; o legal é que não é complexo, mas o oposto; que você pode expressar tudo o que deseja em um sistema tão simples. Comece com uma linguagem de programação; agora jogue TUDO, exceto referências de variáveis, definições de função e chamadas de função. Voila! Cálculo Lambda.


9
Eu posso te ensinar cálculo lambda em cinco minutos. Agora, entender as consequências do que você acabou de aprender leva uma vida inteira. :)

5
Escolhi Haskell em vez de Scheme, principalmente porque ele não tem tantos parênteses!
Joey Adams

Respostas:


27

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.


3
Obrigado por me sugerir o OCaml, e sim, arriscarei minha alma e explorarei o F #. Eu desenvolvo para Linux, Mac OS X e Windows (principalmente o primeiro), mas o FSI parece estar disponível para todas as três plataformas (executando mono no Linux e Mac OS X), o que eu já faço. O fato de todo o peso da Microsoft estar por trás de uma linguagem de programação funcional (embora seja "impura") deve ser bem-vinda, em vez de menosprezada pelos fãs de programação funcional.
haziz

SML está morto, ocaml existe para gravação coq
permeakra

1
+1 para ML; é mais claro que Haskell.
M3th0dman

Também acho uma boa idéia aprender SML ou OCaml, depois Haskell (+1). Depois de conhecer esses idiomas, pegar outro (por exemplo, Scala) é muito fácil. Além disso, pode-se observar Scheme, Common Lisp e Clojure (nesta ordem), para ter uma ideia das linguagens dinâmicas.
Giorgio

@haziz: Mesmo quando eles criam um bom software, a Microsoft (ou, nesse caso, Oracle, etc) permanece monopolista, com todas as más práticas envolvidas, como bloqueio de clientes, formatos incompatíveis, implementações incompatíveis, etc.
Giorgio

26

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 .


4
"A sintaxe é muito mais fácil de aprender e ler" é muito subjetiva.

6
@luqui: Verdadeiro. Talvez "regular" seja uma palavra melhor. Sem problemas de reticulação, infixos, precedência ou associatividade - apenas parênteses, muitos parênteses infernais e tolos.
perfil completo de Hoa Long Tam

17

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.


17

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).


6

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.]


6

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.


Obrigado por me sugerir o ML / OCaml, e sim, "arriscarei minha alma" e explorarei o F #. Eu desenvolvo para Linux, Mac OS X e Windows (principalmente o primeiro), mas o FSI parece estar disponível para todas as três plataformas (executando mono no Linux e Mac OS X), o que eu já faço. O fato de todo o peso da Microsoft estar por trás de uma linguagem de programação funcional (embora seja "impura") deve ser bem-vinda, em vez de menosprezada pelos fãs de programação funcional.
haziz

BTW, pedi The Little MLer da Amazon e já o recebi e comecei a minha jornada. Também adicionei o Learning F # à minha biblioteca. Parece ser um guia de ensino mais popular que eu usarei para complementar The Little MLer.
haziz

6

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.


Na verdade, eu usei este wiki / pdf para aprender Haskell e aprimorar minhas habilidades em OCaml (traduzindo Haskell idiomático para OCaml). Seria muito legal se alguém pudesse pegar esse material e "bifurcar" para várias linguagens funcionais. Poderia ser a base para um tiroteio de linguagem funcional bem legal!
Marc

1
O principal problema disso é que ele introduz o parsec sem a introdução de mônadas.
alternativa

O @alternative parsec possui uma interface monádica, mas também possui uma interface aplicável, para não mencionar várias outras funções. Não é que razoável para introduzir Parsec antes da generalização monádico
Philip JF

4

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.


3
"praticamente verifica se seu código está correto" está muito errado. Nenhum sistema de tipos pode fazer isso. (A menos que seu sistema de tipo é uma verdadeira teoremas.)
Eli Barzilay

4
@ Eli, você usou Haskell? Embora teoricamente essa afirmação seja obviamente falsa, na prática acho que ela é bastante precisa, pelo menos em comparação com todas as outras línguas que já usei. Dito isto, eu realmente discordo que essa é uma boa propriedade para iniciantes. Quando estou aprendendo as cordas, prefiro ver especificamente o que meu código fez de errado, em vez de fazer o compilador gritar comigo que está errado e ter que lutar com ele quando nem sei o vocabulário usado pelas mensagens de erro.

1
@ Eli "praticamente" é o termo-chave aqui. No Haskell, você gasta mais tempo pensando em como implementá-lo, e a implementação é bem fácil. Depois, verifique-o para garantir que seus mapas, dobras etc. sejam saudáveis.
alternativa

@ Eli Barzilay: O sistema de tipos de Haskell parece muito próximo de ser um provador de teoremas. Certamente criou um ambiente em que os provadores de teoremas quase parecem mais comuns que outras ferramentas. (Não que eu estou insinuando uma relação causal.)
greyfade

@luqui - Sim, eu usei; não, ainda é uma afirmação falsa, tanto na prática quanto na teoria. Isso não é algo exclusivo de Haskell.
Eli Barzilay

1

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.


0

Se não é puro, você também pode usar uma linguagem imperativa, então Haskell.


0

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.


-2

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.

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.