Funcional como primeira língua

Respostas:

16

Um grande problema é que, se você começar com uma linguagem como Haskell, tudo o mais parecerá abaixo do padrão.

Honestamente, acho que começar com uma linguagem como Haskell ou esquema seria uma ótima idéia.

(Admito que sou viciado em linguagem funcional)

OK, o que eu gosto nos dois idiomas:

O esquema utiliza uma linguagem muito simples e cria uma linguagem maravilhosamente robusta para o desenvolvimento. Também o SICP está escrito sobre o esquema, o que faz valer a pena aprender ali. Esquema é a coisa mais simples que você pode imaginar que pode ser uma linguagem completa.

Haskell O que realmente está crescendo para mim é o sistema de tipos. Muitos dos erros que vejo em outros idiomas se devem ao tipo errado que aparece em algum lugar. Em Haskell isso é quase impossível. Além disso, a idéia de uma linguagem preguiçosa apenas causa algumas coisas legais. Por exemplo, você pode criar estruturas de dados infinitas no Haskell e, em seguida, criar apenas a parte necessária.

Zachary K
fonte
Para ser justo, várias línguas estão incorporando aspectos cada vez mais funcionais, para que a vida não seja tão ruim quanto costumava ser.
Tikhon Jelvis
É verdade, e para alguém que ama FP isso não é nada, mas uma coisa boa
Zachary K
3
Eu sei - estou sugerindo isso como uma boa razão para aprender FP primeiro. É uma tendência que me deixa muito feliz há um tempo.
Tikhon Jelvis
Mas realmente não diz muito para responder à pergunta - por que você gosta de Haskell (ou Scheme)? Seriam bons os primeiros idiomas para aprender? Por quê?
jimwise
Adicionados alguns comentários sobre os dois idiomas
Zachary K
6

A maior vantagem de aprender uma linguagem funcional antes de aprender uma linguagem OOP é que suas habilidades de programação se desenvolvam primeiro e, em seguida, você pode entender facilmente os conceitos de OOP. Se você começar diretamente com uma linguagem OOP, terá que aprender duas coisas simultaneamente: "pensar no código" e "pensar no OOD". Pode ser uma distração. Primeiro pratique com uma linguagem funcional e desenvolva suas habilidades de programação. Então aprenda OOP e outros paradigmas. Como a OOP foi projetada para compensar as deficiências na programação estrutural, será mais fácil entender o porquê. Essa é a razão pela qual os cursos de CS começam com C e depois seguem para C ++.

DPD
fonte
1
Na minha universidade, começamos com uma linguagem funcional, o Standard ML, e aprendemos quais são os efeitos colaterais. Depois disso, aprendemos C, mas nunca aprendemos C ++.
Jonas
@Jonas. Eu acho que diferentes países / universidades têm estruturas de cursos muito diferentes. Na minha universidade, C seguido de C ++ é um padrão para os cursos da Comuter Science Engg, mas para outros fluxos de engenharia, apenas C é ensinado.
DPD
Na minha universidade, começamos com Java e depois usamos a linguagem apropriada para os cursos. Por exemplo, C / C ++ é usado para sistemas de programação, C # para IU, várias linguagens de montagem para organização de computadores e eu acho que o que quiser para jogos de programação
Carson Myers
Na minha universidade, começamos aprendendo o esquema (com o SICP). As primeiras semanas foram inteiramente funcionais; OOP foi introduzido bem no curso. Achei que tudo estava muito bem organizado e gostei bastante do curso.
Tikhon Jelvis
6

Sobre a questão de como aprender programação iniciando com programação funcional, duas recomendações clássicas:

  • O primeiro, e óbvio, é o clássico Estrutura e Interpretação de Programas de Computador , de Abelson e Sussman, que continua sendo uma das melhores introduções ao CS por aí, e é ensinado de uma perspectiva funcional, usando o Scheme. Está disponível na íntegra online . Se você não começar por aqui, deve chegar aqui em algum momento.

  • Um texto mais recente que cobre a maior parte do mesmo terreno em um ritmo mais suave e com um foco mais forte na engenharia de software é How to Design Programs , de Matthew Felleisen e vários outros da equipe Racket / PLT, que usa o dialeto Racket de Esquema. Também está disponível online , assim como a segunda edição em andamento . Este livro tem a vantagem de ter sido projetado para ser usado com o ambiente de programação DrRacket, que fornece uma interface muito amigável para iniciantes e especialistas para experimentar o código.

Sobre a questão de por que começar com a programação funcional, eu gostaria de apontar para o Blog de Bob Harper . Carnegie Mellon recentemente reformulou seu currículo de CS para ensinar programação funcional primeiro, e Harper vem cobrindo seu progresso, golpe por golpe, em seu blog. Como um dos responsáveis ​​por trás da definição do Standard ML, é óbvio que ele é a favor dessa mudança e argumenta bem as razões para isso.

Finalmente, eu recomendaria não aprender Haskell primeiro, embora outros possam discordar. Enquanto a abordagem pura de Haskell ao FP certamente criará bons hábitos, o foco da linguagem na computação preguiçosa não é necessariamente uma boa combinação para o iniciante; Uma das primeiras e mais importantes coisas que você precisará aprender a fazer como programador é raciocinar exatamente sobre o que seu programa está fazendo olhando a fonte e sobre o custo relativo de diferentes abordagens para o mesmo problema. É minha experiência que a preguiça de Haskell torna essas duas atividades um desafio até para programadores experientes, embora Sua milhagem possa variar.

jimwise
fonte
5

A principal vantagem (ou desvantagem) de começar com o FP é que a maioria dos conceitos também se aplica à programação imperativa. Realm of Racket usa analogias de videogame para ensinar conceitos funcionais e imperativos, e os alunos dedicados ficam não apenas com um jogo funcional (npi), mas com um sólido entendimento de condicionais, recursão, loops, ADTs e design orientado a eventos. Esses conceitos são praticamente onipresentes na programação moderna e são usados ​​constantemente.

Ainda mais importante, porém, é aprender a codificar abstrações , algo em que o FP é excelente, com o uso de funções e tipos de dados de ordem superior. Como criar programas adota uma abordagem única para isso, ensinando através da indução. Por exemplo, os alunos aprendem como foldfunciona examinando o código para obter a soma e o produto de uma lista, descobrindo o que eles têm em comum e derivando a implementação eles mesmos.

O equivalente ao POO acima provavelmente envolveria um ou mais dos seguintes itens: interfaces, classes abstratas, genéricos, functores ou (se você estiver fazendo errado) singletons. Embora esses sejam padrões de design perfeitamente aceitáveis ​​em Java, o IMHO não pertence a um currículo introdutório e serve apenas para ofuscar os princípios subjacentes. Mesmo como alguém que foi introduzido nas linguagens FP "atrasado", posso dizer que navegar pelo mar sempre em mudança do OOP foi muito mais fácil por ter uma forte âncora funcional.

erro
fonte
Quase esqueci: se você quer comprar Realm of raquete, tente este cupão: RACKETEERS. Não tenho certeza quando expira, desculpe.
bug
+1 por mencionar funções de ordem superior - eu estava pronto para postar minha própria resposta sobre elas. Metade dos meus colegas de trabalho luta com o conceito, e os demais que os recebem não pensam neles quando seria a solução mais simples.
Izkata
1
Eu não tinha ouvido falar de Realm of Racket, mas pelo título soube imediatamente o que era, porque o título é uma referência ao seu irmão mais velho, Land of Lisp.
Magus
4

A programação funcional facilita muito as coisas. Nos idiomas OOP, você precisa lidar com o gerenciamento de estado em vários segmentos sem arruinar esse estado. Nas linguagens funcionais, quando a maior parte do trabalho está sendo realizada por funções puras, você não precisa se preocupar com isso.

Em termos de velocidade / desempenho, eu não sou um jóquei de desempenho real, mas ser funcional não significa ser lento, e a estrutura das linguagens funcionais tem pouco a ver com sua velocidade. A sintaxe das linguagens funcionais varia muito, como as diferenças entre Clojure e Haskell. O Clojure é muito rápido como está e pode alcançar (e às vezes exceder) as velocidades do Java com a otimização após o fato.

Então tudo depende realmente do que você está procurando

MattyD
fonte
2

Eu acho que a disponibilidade de material de aprendizagem, alguns bons exemplos de código e mentores são muito importantes ao aprender linguagens de programação. Dependendo da sua situação, você pode ter um mentor que possa lhe ensinar, etc. Isso significa que você progredirá mais lentamente em comparação com o aprendizado de idiomas comuns. Mas se você não estiver com pressa, isso não será um problema.

Endy Tjahjono
fonte
1
Eu acho que suas suposições estão erradas. Não são tutoriais bons, livros, papéis etc. sobre assuntos funcionais. Além disso, existem muitos documentos por aí que lidam com coisas especiais, como sistema de tipos, implementação, máquinas virtuais, cálculo lambda e assim por diante.
Ingo
1

Talvez o motivo mais importante para considerar o aprendizado de linguagens de programação funcionais seja o entendimento de tipos de dados algébricos. O mapeamento mental ajudará na modelagem das relações de classe OO e até no design do banco de dados.

O foco em sistemas multi-core / multi-processador enfatiza o uso de algoritmos paralelos que podem ser expressos de forma mais clara e concisa no FP. O ramo lambda dos idiomas provavelmente verá um forte aumento no uso nas próximas uma a duas décadas.

Mas também existem algumas armadilhas comuns. Acreditar que o FP é mais simples é um grande erro, pois calcular a complexidade do espaço e do tempo, além de fornecer provas de interrupção, pode ser muito mais desafiador no cálculo lambda, especialmente em idiomas que suportam uma avaliação lenta.

Então, aprenda os dois! Ou talvez melhor: primeiro aprenda um idioma que abraça ambos, como o Scala. Se você não se importa com camisetas tie-die e um leve sotaque holandês, talvez você ache as palestras de FP do Dr. Erik Meijer úteis, que estão no MSDN.

Dibbeke
fonte