Quais são as vantagens de usar LISP e Haskell? Eles vão me tornar um programador melhor? [fechadas]

41

Eu sei que Lisp e Haskell são linguagens de programação lógica e funcional, respectivamente, mas o que exatamente isso significa? Como eles diferem de outros idiomas? Ouvi dizer que aprender isso fará de você um programador melhor e melhorará sua lógica. Isso é verdade, e se eu for aprendendo Lisp ou Haskell a um nível competente, minha programação melhorará e serei melhor em lidar com qualquer problema em qualquer idioma? Eu só queria saber se vale a pena o esforço de aprender. Essas linguagens também são úteis em áreas como GUI e gráficos ou são úteis apenas para aplicativos de console?

Logan545
fonte
36
Usar o LISP e o Haskell fará de você um melhor programador do LISP e do Haskell, eu garanto.
Neil
17
@MasonWheeler, tenho que dizer; existe muito no sistema de tipos de Haskell que você não encontrará em nenhum outro idioma, e as macros LISP não podem ser encontradas em nenhum idioma comum. Ambas as coisas são dignos de aprendizagem porque não fazer de você um programador melhor em sua língua de trabalho. Pelo menos essa tem sido minha experiência; Haskell me tornou um desenvolvedor C # de empresa melhor. Conheço técnicas para implementar claramente a separação de preocupações que nunca teria de outra maneira, e analisar problemas será para sempre muito mais simples para mim do que antes de aprender Haskell.
Jimmy Hoffa
6
Erlang é uma linguagem funcional. O Rabbit MQ é escrito em Erlang e o Rabbit é usado em muitos lugares para realizar muitos levantamentos pesados ​​de missão crítica. Linguagens funcionais ensinam você a pensar de maneira diferente sobre programação, e essa é uma boa ferramenta extra a ter à sua disposição. Embora seja verdade que alguns desses conceitos o transformaram em linguagens mais populares (por exemplo, expressões lambda em C # e C ++), você ainda aborda a solução de problemas de uma maneira muito diferente ao usar uma linguagem funcional.
Binary Worrier
8
@MasonWheeler Há perfeitamente boas razões para um idioma ser mais útil que o resto, mas ainda não amplamente utilizado. Posso pensar em muitos: base de usuários existente, uma mudança muito radical, quando "bom é bom o suficiente" e também ... quando a melhor ferramenta requer programadores treinados formalmente. Portanto, a popularidade não é uma boa medida de utilidade .
Andres F.
5
@MasonWheeler Para usar uma analogia, a matemática é um campo extremamente útil na vida real. Então, por que mais pessoas não são competentes em matemática? Por que muitas pessoas têm medo disso e pensam que é magia negra e não é tão útil?
Andres F.

Respostas:

37

É muito parecido com o fato de aprender matemática melhorar suas habilidades analíticas e aprender literatura latina / clássica melhorará suas habilidades de escrita.

As pessoas que criaram esses idiomas pensaram muito sobre o que significa escrever um programa. E essas línguas são os resultados dessas pesquisas.

Dito isto, aprender Java também o tornará um programador melhor. E aprendendo C. Os benefícios reais vêm do aprendizado de idiomas com uma filosofia diferente. Então você pode ter sua própria opinião sobre a forma como um programa deve ser escrito.

Editar

Sei que essa resposta não é tão útil para pessoas que ainda não aprenderam haskell e / ou cece. Aqui estão alguns exemplos para explicar melhor o que quero dizer

LISP

O Lisp acredita que a sintaxe deve ser mínima e que tudo deve ser uma lista ou uma primitiva (Lisp significa Processamento de lista). Mesmo os programas são principalmente lista contendo outras listas e símbolos. Lisp permite manipular programas como lista e gerar novos programas em tempo real. Daí o code is data and data is codelema inteiro .

A conseqüência direta é que as linguagens Lisp permitem definir qualquer interface desejada. Um bom exemplo é o compojure, que é uma estrutura da web clojure. Aqui está a aparência de uma função de roteamento

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

Outro bom exemplo é a estrutura de modelos de soluços:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

Como você pode ver, o resultado é tão conciso quanto no DSL, como o bigode, mas permite que você use os recursos de linguagem como (for [x (range 1 4)] block). Ainda melhor, você tem todas as ferramentas para abstrair e estruturar seu código.

Em outros idiomas, a sintaxe é mais complexa. Você não pode ler um programa Java como um monte de listas. Mas, usando o Lisp, você tem uma idéia melhor sobre como deve ser a interface ideal e o que pode ser abstraído em seu código como dados. Também ajuda a ver seu idioma favorito como uma estrutura de big data e a entender melhor sua semântica.

Haskell

Haskell acredita em forte digitação estática e pureza. Funções puras são como funções matemáticas: elas são definidas em um conjunto de valores e as mapeiam em outro conjunto. A função não tem efeitos colaterais e os valores são imutáveis. A pureza é interessante porque não é algo que uma linguagem multiparadigma possa ter. Uma linguagem é pura ou não.

Uma conseqüência é que você não pode executar ações de IO quando quiser (os haskellers acreditam que isso é uma coisa boa). As ações de IO são definidas como transações, que são valores puros. O mainvalor de um programa haskell é uma transação de E / S executada quando você executa o programa.

Você precisa lidar explicitamente com o fluxo de dados no seu programa. Você não pode fazer a comunicação de dois componentes escrevendo e lendo coisas em uma variável global. Você tem que construir e passar valores.

Outro recurso mencionado por Jimmy Hoffa é o sistema de tipos ricos. Enquanto outros idiomas têm digitação estática, no haskell você pode ter coisas como:

length :: [a] -> Int (função de uma lista de a para int)

map :: (a -> b) -> [a] -> [b](função que recebe uma a to btransformação e uma lista de a e retorna uma lista de b)

O bom é que não preciso explicar o que essas funções realmente fazem: você já entende o comportamento delas. Além do mais, as funções com essas assinaturas não podem nada além de calcular o comprimento de uma lista e mapear uma transformação sobre uma lista.

Em outras linguagens digitadas, as hierarquias de classe combinadas com a mutabilidade tornam o tratamento desses tipos um pesadelo. Você precisa entender coisas como covariância e contravariância, que são impossíveis de corrigir da perspectiva da linguagem (ou seja, simples, poderosas e seguras).

Você segue o caminho seguro (como o scala) e acaba com uma linguagem realmente complexa, ou segue o caminho simples e obtém algo que é limitado (genéricos do google go limitados à lista e mapas) ou inseguro (genéricos de dardo que são sempre covariante).

Usando o haskell, você aprende principalmente sobre os benefícios da pureza e como escrever código puro.

Simon Bergot
fonte
11
@ JimmyHoffa Acho que realmente merece sua própria resposta, porque é isso que as pessoas tendem a ignorar. Existem domínios de problemas melhor resolvidos pela programação funcional que as pessoas nem percebem que existem até que pelo menos tenham se envolvido nesses domínios fora de sua zona de conforto.
KChaloux # 9/13
2
Não conheço a Assembléia e também não mencionei. No entanto, a montagem pode ajudá-lo a entender como seus programas estão sendo executados. Há ótimas publicações sobre SO de pessoas capazes de analisar uma peça de montagem gerada para explicar um problema de desempenho.
Simon Bergot
3
@KChaloux Gostaria de escrever a resposta, mas esta pergunta deve ser encerrada (encerro votado em conformidade). Simplificando, eu poderia escrever minha opinião e experiência em uma resposta, mas não seria mais certo ou errado do que as outras respostas, que é o problema das perguntas de recomendação de idioma e por que votei para fechar.
Jimmy Hoffa
7
OMG, @ Nee saber o que o computador está realmente fazendo com mais segurança fará de você um programador melhor. Não escrevo montagem há anos, mas a leio regularmente (em várias plataformas) e, se você se preocupa com o funcionamento do seu programa, é essencial conhecer pelo menos o básico.
dash-tom-bang
3
@ Neil, em que caso ser um programador pior é um benefício? O que faz você abrir o código do espaguete? O que o código do espaguete tem a ver com assembly ou ser um bom programador, exceto na terra da fantasia de não conhecer o assembly e precisar de uma racionalização para evitar aprendê-lo? De qualquer forma, ser um bom codificador de montagem torna altamente ciente das práticas ruins de codificação.
Dash-tom-bang
12

tl; dr Aprender coisas novas só pode fazer de você um programador melhor, mas ser um programador melhor não é sobre as línguas que você pode escrever código.

Quais são as vantagens de usar LISP e Haskell?

LISP:

  1. Código homoicônico. Isso permite código auto-modificado estruturado.
  2. Macros com reconhecimento de sintaxe. Eles permitem a reescrita do código padrão.
  3. Pragmatismo. O CL foi projetado para realizar tarefas de profissionais que trabalham. A maioria das linguagens funcionais não é, em regra.
  4. Flexibilidade. Pode fazer muitas coisas diferentes, tudo a velocidades razoáveis.
  5. Wartiness. O mundo real está bagunçado. A codificação pragmática acaba tendo que usar ou inventar construções confusas. O Lisp comum tem verrugas suficientes para realizar as tarefas.

Indiscutivelmente, as únicas razões reais para escolher o CL é que as bibliotecas padrão são datadas.

Vou falar um pouco e dizer que, no caso geral, a sintaxe não deve ser um problema para um trabalhador profissional de software.

De: Por que o Lisp é útil?

Haskell:

Haskell é uma linguagem de programação de computador. Em particular, é uma linguagem polimorficamente estática, preguiçosa e puramente funcional, bem diferente da maioria das outras linguagens de programação. O idioma é nomeado para Haskell Brooks Curry, cujo trabalho em lógica matemática serve como base para linguagens funcionais. Haskell é baseado no cálculo lambda, daí o lambda que usamos como logotipo.

Você pode ler lá uma descrição de Funcional vs imperativo

De: http://www.haskell.org/haskellwiki/Introduction

Eles vão me tornar um programador melhor?

Sim, é claro, conhecer mais linguagens e paradigmas só pode torná-lo um programador melhor, mas entenda isso:

Não existe uma única ferramenta, um único livro, um único paradigma de programação que o tornará um programador melhor.

Aprender diferentes linguagens de programação com diferentes paradigmas definitivamente ajuda você a ser um programador melhor, aprender a resolver problemas com diferentes abordagens também beneficia muito seu pensamento lógico.

Ser um bom programador não tem muito a ver com o idioma, mas com a capacidade de resolver qualquer problema em qualquer idioma. E quando você não conhece o idioma, a capacidade de aprender esse idioma rapidamente e usá-lo efetivamente.

Penso que, quanto mais global é o seu pensamento, melhor você é o desenvolvedor.

Por exemplo, você pode adicionar comentários úteis ao seu código, se preocupar com a legibilidade do seu código, a manutenção. Preste atenção aos pequenos detalhes. Pense antes de digitar !. Aprenda sobre os padrões de criação. Siga as boas práticas.

Divulgação: essa é a publicidade descarada do pior tipo, porque é do meu blog.

jsedano
fonte
4
Você aprendeu LISP ou Haskell em algum nível competente?
Jimmy Hoffa
10
É um pouco falso ouvir isso de alguém que não conhece quase nada de nenhum dos idiomas. Você alega que não são ferramentas necessárias no momento, mas não tem idéia para que servem essas ferramentas; então, como você pode saber disso? Além disso, como você pode aconselhar alguém o que eles aprenderão ou não com eles, até onde você sabe, o LISP é um derivado SQL útil apenas na análise de dados relacionais e Haskell pode ser um subconjunto estrito do Regexp.
Jimmy Hoffa
10
Isso realmente não responde à pergunta. Você conseguiu o feito impressionante de dar uma resposta vagamente geral a uma pergunta sobre duas línguas você não sabe: /
Andres F.
2
-1 porque isso vagamente dança em torno do que exatamente Common Lisp e Haskell ensinam. Exemplos: Código de dados de dados de código, pureza, transparência referencial, captações monádicos, programação funcional, linguagem de programação orientada, tipo de programação dirigida, etc etc etc
jozefg
3
Além disso, não conhecendo nenhum dos idiomas, acho que você não pode responder a essa pergunta: / Desculpe
jozefg 9/09/13
9

Quando você aprende idiomas que estão fora do paradigma em que você costuma operar, ele abre sua mente para soluções alternativas no seu dia a dia e pode até ajudá-lo a entender melhor alguns recursos do seu idioma de escolha. Só o conhecimento dessas línguas não o tornará um programador melhor, a menos que você possa tirar as lições aprendidas dessas línguas e aplicá-las a situações que você vê todos os dias.

Dito isto, não se limita a idiomas. Quando você lê várias estruturas de dados que nunca viu ou usou antes, isso pode ajudar a ampliar o escopo de seu conhecimento e, na próxima vez em que encontrar um problema, você terá mais uma solução possível.

Jetti
fonte