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

38

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 outras línguas? 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 eles valem 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?

    
por Logan545 09.09.2013 / 18:08
fonte

3 respostas

33

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

As pessoas que criaram essas linguagens 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 fará de você um programador melhor. E aprendendo C. Os benefícios reais vêm do aprendizado de idiomas com filosofia diferente. Então você pode ter sua própria opinião sobre como um programa deve ser escrito.

Editar

Eu percebo que essa resposta não é tão útil para pessoas que ainda não aprenderam haskell e / ou lisp. Aqui estão alguns exemplos para explicar mais o que quero dizer

LISP

Lisp acredita que a sintaxe deve ser mínima e que tudo deve ser uma lista ou uma primitiva (Lisp significa List Processing). Mesmo programas são principalmente lista contendo outras listas e símbolos. Lisp permite manipular programas como lista e gerar novos programas rapidamente. Daí todo o code is data and data is code lema.

A consequência direta é que as linguagens Lisp permitem que você defina qualquer interface desejada. Um bom exemplo é o compojure, que é um framework web clojure. Aqui está como uma função de roteamento se parece

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

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

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

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

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

Haskell

Haskell acredita em strong tipagem estática e pureza. Funções puras são como funções matemáticas: são definidas em um conjunto de valores e mapeadas 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 multi-paradigmática possa ter. Uma linguagem é pura ou não.

Uma consequência é que você não pode executar a ação de IO sempre que quiser (os haskellers acreditam que isso é bom). As ações de IO são definidas como transações, que são elas próprias valores puros. O valor main de um programa haskell é uma transação IO executada quando você executa o programa.

Você precisa lidar explicitamente com o fluxo de dados em seu programa. Você não pode fazer dois componentes se comunicarem escrevendo & 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 outras linguagens têm tipagem estática, no haskell você pode ter coisas como:

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

map :: (a -> b) -> [a] -> [b] (função que usa uma transformação a to b e uma lista de a's e retorna uma lista de b's)

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

Em outras linguagens tipificadas, as hierarquias de classes combinadas com a mutabilidade tornam o tratamento desses tipos um pesadelo. Você tem que entender coisas como covariância e contravariância, que são impossíveis de acertar do ponto de vista da linguagem (ou seja, simples, poderoso e seguro).

Ou você toma o caminho seguro (como scala) e termina com uma linguagem muito complexa, ou pega o caminho simples e obtém algo que é limitado (google go generics limitado a lista e mapas) ou inseguro (dart genéricos que são sempre covariantes).

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

    
por 09.09.2013 / 18:28
fonte
12

tl; dr Aprender coisas novas só pode fazer de você um programador melhor, mas ser um programador melhor não é sobre os idiomas nos quais você pode escrever código.

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

LISP:

  1. Homoiconic code. This allows structured self-modifying code.
  2. Syntax-aware macros. They allow rewriting of boilerplate code.
  3. Pragmatism. CL is designed to get stuff done by working professionals. Most functional languages aren't, as a rule.
  4. Flexibility. It can do a lot of different things, all at reasonable speeds.
  5. Wartiness. The real world is messy. Pragmatic coding winds up having to either use or invent messy constructs. Common Lisp has sufficient wartiness that it can get stuff done.

Arguably the only real reasons to choose against CL is that the standard libraries are dated.

I will go out on a limb and say that in the general case, syntax should not be an issue to a professional software worker.

De: Por que o Lisp é útil?

Haskell:

Haskell is a computer programming language. In particular, it is a polymorphically statically typed, lazy, purely functional language, quite different from most other programming languages. The language is named for Haskell Brooks Curry, whose work in mathematical logic serves as a foundation for functional languages. Haskell is based on the lambda calculus, hence the lambda we use as a logo.

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

De: link

Eles me tornarão um programador melhor?

Sim, claro, saber mais idiomas 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 faça de você um programador melhor.

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

Ser um bom programador não é muito sobre o idioma, mas sim ter a capacidade de resolver qualquer problema em qualquer idioma. E quando você não conhece a língua, a capacidade de aprender essa linguagem rapidamente e usá-la efetivamente.

I think, that the more global your thinking is, the better developer you are.

For example, you may add useful comments to your code, care about the readability of your code, the maintainability. Pay attention to the little details. Think before typing!. Learn about desing patterns. Follow good practices.

Divulgação: Isso é publicidade sem vergonha do pior tipo, porque é de meu blog.

    
por 09.09.2013 / 18:37
fonte
9

Quando você aprende idiomas que estão fora do paradigma que você costuma operar, ele abrirá sua mente para soluções alternativas no seu dia a dia e pode até mesmo ajudá-lo a entender melhor alguns recursos em sua linguagem de escolha. Apenas conhecer essas línguas não fará de você um programador melhor, a menos que você possa aproveitar as lições aprendidas nesses idiomas e aplicá-las a situações que você vê todos os dias.

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

    
por 09.09.2013 / 21:56
fonte

Tags