Para aqueles de vocês experientes em Haskell e algum sabor de Lisp, estou curioso para saber como é "agradável" (para usar um termo horrível) escrever código em Haskell versus Lisp.
Algumas informações básicas: estou aprendendo Haskell agora, tendo trabalhado anteriormente com Scheme e CL (e uma pequena incursão em Clojure). Tradicionalmente, você poderia me considerar um fã de linguagens dinâmicas pela sucinta e rapidez que elas fornecem. Eu rapidamente me apaixonei pelas macros Lisp, pois me deram mais uma maneira de evitar verbosidade e clichê.
Estou achando Haskell incrivelmente interessante, pois ele está me apresentando a formas de codificação que eu não sabia que existiam. Definitivamente tem alguns aspectos que parecem ajudar a alcançar agilidade, como facilidade de escrever funções parciais. No entanto, estou um pouco preocupado em perder macros Lisp (presumo que as perdi; verdade seja dita, talvez ainda não tenha aprendido sobre elas?) E com o sistema de tipagem estática.
Alguém que fez uma boa codificação na mente de ambos os mundos comentaria sobre como as experiências diferem, o que você prefere e se essa preferência é situacional?
fonte
Em primeiro lugar, não se preocupe em perder recursos específicos, como a digitação dinâmica. Como você está familiarizado com Common Lisp, uma linguagem notavelmente bem projetada, suponho que você saiba que uma linguagem não pode ser reduzida a seu conjunto de recursos. Trata-se de um todo coerente, não é?
Nesse sentido, Haskell brilha tanto quanto o Common Lisp. Seus recursos se combinam para fornecer a você uma forma de programação que torna o código extremamente curto e elegante. A falta de macros é atenuada um pouco por conceitos mais elaborados (mas, da mesma forma, mais difíceis de entender e usar) como mônadas e setas. O sistema de tipos estáticos aumenta seu poder, em vez de atrapalhar, como acontece na maioria das linguagens orientadas a objetos.
Por outro lado, a programação em Haskell é muito menos interativa do que Lisp, e a tremenda quantidade de reflexão presente em linguagens como Lisp simplesmente não se encaixa na visão estática do mundo que Haskell pressupõe. Os conjuntos de ferramentas disponíveis para você são, portanto, bastante diferentes entre os dois idiomas, mas difíceis de comparar.
Pessoalmente, prefiro a forma de programação Lisp em geral, pois sinto que se adapta melhor à maneira como trabalho melhor. No entanto, isso não significa que você também deve fazer isso.
fonte
Há menos necessidade de metaprogramação em Haskell do que em Common Lisp porque muito pode ser estruturado em torno de mônadas e a sintaxe adicionada faz com que as DSLs incorporadas pareçam menos como uma árvore, mas sempre há o Template Haskell, como mencionado por ShreevatsaR , e até mesmo Liskell (semântica Haskell + Lisp sintaxe) se você gostar dos parênteses.
fonte
Em relação às macros, aqui está uma página que fala sobre isso: Hello Haskell, Goodbye Lisp . Ele explica um ponto de vista em que as macros simplesmente não são necessárias em Haskell. Ele vem com um pequeno exemplo para comparação.
Exemplo de caso em que uma macro LISP é necessária para evitar a avaliação de ambos os argumentos:
Caso de exemplo em que Haskell não avalia sistematicamente ambos os argumentos, sem a necessidade de algo como uma definição de macro:
E voilà
fonte
delay
não pode ser uma função.accept
é o (E) DSL. Aaccept
função é análoga à macro delineada nas páginas anteriores, e a definição dev
é exatamente paralela à definição dev
no Esquema no slide 40. As funções Haskell e Esquema computam a mesma coisa com a mesma estratégia de avaliação. Na melhor das hipóteses, a macro permite que você exponha mais da estrutura do seu programa para o otimizador. Você dificilmente pode reivindicar isso como um exemplo em que as macros aumentam o poder expressivo da linguagem de uma forma não replicada por avaliação preguiçosa.automaton
tornando- se , tornando- seletrec
,:
tornando- se nada nesta versão). Tanto faz.accept
->
Sou um programador Common Lisp.
Depois de tentar Haskell há algum tempo, meu resultado pessoal era continuar com CL.
Razões:
Haskell tem seus próprios méritos, é claro, e faz algumas coisas de uma maneira fundamentalmente diferente, mas simplesmente não funciona a longo prazo para mim.
fonte
dilbert = dogbert.hire(dilbert);
" ?? Duvido que muitos programadores de Haskell consigam ler isso sem se mexer um pouco.Em Haskell você pode definir uma função if, o que é impossível no LISP. Isso é possível devido à preguiça, que permite mais modularidade nos programas. Este artigo clássico: Por que o FP é importante, de John Hughes, explica como a preguiça aumenta a capacidade de composição.
fonte
fold
, por exemplo, enquanto que as funções não-rígidas fazer .Existem coisas muito legais que você pode conseguir no Lisp com macros que são complicadas (se possível) em Haskell. Tome por exemplo a macro `memoize '(veja o Capítulo 9 do PAIP de Peter Norvig). Com ele, você pode definir uma função, digamos foo, e então simplesmente avaliar (memoize 'foo), que substitui a definição global de foo por uma versão memoizada. Você pode obter o mesmo efeito em Haskell com funções de ordem superior?
fonte
À medida que continuo minha jornada de aprendizado com Haskell, parece que uma coisa que ajuda a "substituir" macros é a capacidade de definir seus próprios operadores de infixo e personalizar sua precedência e associatividade. Meio complicado, mas um sistema interessante!
fonte