Estou estudando Haskell com o objetivo de entender a programação funcional, com a expectativa de aplicar a percepção que obtiver em outras linguagens (principalmente Groovy, Python, JavaScript).
Escolhi Haskell porque tive a impressão de que é muito puramente funcional e não permitiria nenhuma confiança no estado.
Não escolhi aprender Haskell porque estava interessado em navegar em um sistema do tipo extremamente rígido.
Minha pergunta é a seguinte: Um sistema de tipo forte é um subproduto necessário de uma linguagem funcional extremamente pura ou é uma opção de design não relacionada específica da Haskell?
functional-programming
haskell
language-features
type-systems
Eric Wilson
fonte
fonte
Respostas:
Acredito que entender o sistema de tipos de Haskell é um amplificador para entender a programação funcional.
A questão da programação puramente funcional é que, na ausência de efeitos colaterais, que permitem fazer todo tipo de coisa implicitamente, a programação puramente funcional torna a estrutura dos seus programas muito mais explícita.
Haskell impede que você jogue as coisas debaixo do tapete, obriga a lidar com a estrutura do seu programa explicitamente e ensina uma linguagem para descrever essas estruturas: a linguagem dos tipos. Compreender tipos, tipos particularmente ricos como o Haskell, fará de você um programador melhor em qualquer idioma.
Se Haskell não fosse fortemente tipado, conceitos como mônadas, functores aplicativos e afins nunca seriam aplicados à programação.
fonte
A linguagem funcional mais dinamicamente digitada é Scheme. Dito isto, o sistema de tipos de Haskell é um indicador de sua pureza. É uma questão de "como se mede a pureza?". O sistema de tipos de Haskell permite isolar facilmente ações impuras
IO
. Para fazer isso, você precisa de um sistema de tipo estático.Mas digamos que o sistema de tipos de Haskell não tenha nada a ver com programação funcional. Ainda seria a altura da arrogância afirmar que o sistema de tipos não o ajudaria nesse empreendimento educacional. O sistema de tipos de Haskell é rico e complexo, e ainda mais interessante quando comparado aos sistemas de tipos de C ++ e OCaml.
Isso é um obstáculo? Não, acho que é um trunfo. Tente considerar como lidar com a preguiça de Haskell sem,
IO
por exemplo.fonte
O Clojure é do tipo dinâmico e quase tão puro quanto o Haskell; portanto, há um bom argumento de que o sistema de tipos do Haskell era mais uma opção de design do que um requisito absoluto. Ambos definitivamente têm seus pontos fortes, então você pode considerar o Clojure se realmente não gosta da rigidez de Haskell (mas veja abaixo).
Quando comecei a usar o Haskell, considerei o sistema de tipos irritante e só o tolerava devido à inferência de tipos. Logo descobri que muitos dos erros de tipo que o compilador se queixava de coisas que não teriam funcionado de qualquer maneira, mesmo que o compilador me tivesse permitido fazê-lo (por exemplo, acidentalmente usando o mapa em vez do concatMap). Descobri então que os programas que passaram na verificação de tipo estavam geralmente corretos, ou pelo menos perto de corrigir. Eu até tive uma fase preguiçosa em que refatorei alterando um tipo de função e deixando o compilador me dizer o que mais precisava ser mudado. Finalmente, percebi que o sistema de tipos de Haskell era realmente muito expressivo e comecei a projetar meus programas em torno de tipos. Esse é o Santo Graal de Haskell.
fonte
if
s econd
s em Scheme, que eu imagino que também seja transferido para Clojure.O sistema de tipos de Haskell é a chave para sua capacidade de isolar efeitos do código puro. A menos que você possa isolar efeitos de outra maneira ou remover completamente os efeitos, um sistema de tipo estático forte é um requisito para a programação funcional pura.
Haskell é um exemplo muito bom de uma linguagem com um sistema de tipos estático forte. Se você deseja uma educação ampla e abrangente em ciência da computação e design de linguagem de programação em particular, Haskell seria uma excelente escolha como uma das línguas que você deveria aprender.
O sistema de tipos não deve ser um grande obstáculo. As pessoas que programam tendem a, mesmo quando usam linguagens dinâmicas, seguir convenções de digitação que podem ser codificadas usando o sistema de tipos de Haskell. Haskell também apresenta inferência de tipo que alivia a verbosidade quando comparado a linguagens como C ++ e Java. Quando você recebe uma mensagem de erro, o compilador está apenas dizendo em tempo de compilação o que uma linguagem com tipos dinâmicos diria em tempo de execução.
O oposto de um sistema de tipo dinâmico é um sistema de tipo estático, não um sistema de tipo forte. Um sistema de tipo forte é o oposto de um sistema de tipo fraco.
fonte
Ele informa imediatamente quando você comete erros estúpidos. Isso é útil. Eu tenho trabalhado em Racket (Scheme) neste último período e houve várias vezes em que passei um s-exp não analisado em que esperava um ast analisado para alguma função no meu intérprete, e ele só apareceu no meu suíte de teste de tamanho médio. Se eu tivesse alguma digitação estática, isso teria sido trazido à minha atenção imediatamente.
Obviamente, os erros lógicos não podem realmente ser detectados pelo sistema de tipos, mas o número de maneiras pelas quais você pode errar é bastante reduzido.
Além disso, a inferência de tipo permite ignorar o sistema de tipos, se desejar. Ainda está lá, mas não requer informações ativas de sua parte. Ainda é útil entender os tipos de suas funções, mas o código correto funcionará bem.
A pureza de Haskell é codificada em seu sistema de tipos. A mônada de E / S é uma construção no nível de tipo que impede que o código impuro vaze para funções puras, portanto a pureza é garantida pelo sistema de tipos.
fonte
Ser uma linguagem "funcional" significa (além de outras coisas) que funções são objetos de primeira classe na linguagem.
Ser uma linguagem "pura" significa que funções são funções matemáticas (ao contrário de procedimentos) - com a mesma entrada, elas sempre produzem a mesma saída.
Uma "linguagem funcional pura" é aquela em que ambos os itens acima se aplicam. Não tenho conhecimento de um "pura- ly linguagem funcional".
Um sistema de tipo forte é uma maneira limpa de ter uma linguagem pura e prática. Os tipos ajudam o compilador a descobrir otimizações, além de garantir a correção. (Mas essa não é a única maneira - o clojure é puro, mas não possui um sistema de tipos tão forte quanto Haskell.)
Se o sistema de tipos o estiver incomodando, sugiro que tente uma linguagem mais dinâmica, como Scheme, ou use o sistema de inferência de tipos de Haskell.
fonte
Sim, o sistema de tipos é um ativo incrível. Seria muito difícil até descrever como as mônadas funcionam ou como alguns combinadores operam sem o sistema de tipos. Considere quantos tutoriais sobre Haskell primeiro pedem que você considere o tipo de função em questão com a: t no REPL. Isso simplesmente não está disponível para você em um idioma digitado dinamicamente. Claro, toda a complexidade do sistema de tipos ainda está lá. Uma mônada ainda é uma mônada. Mas o idioma decidiu lavar as mãos do assunto e não fornecer nenhuma ajuda. Você está por sua conta, amigo. Eu não estou batendo em idiomas dinamicamente digitados. Eu os amo ternamente. O esquema é uma ferramenta elétrica por excelência. Mas você notará que, quando falamos sobre mônadas em linguagens dinâmicas, geralmente inventamos uma notaçãopara descrever o tipo de procedimentos. Um programador funcional irá lutar com os tipos de uma maneira ou de outra. O verificador de tipos de Haskell apenas fornece boas ferramentas para você aprender como fazer isso.
fonte