Padrões de design funcional [fechado]

106

Existem muitos idiomas funcionais: mônadas, aplicativos, setas, etc. Eles são documentados em artigos diferentes, mas infelizmente não conheço nenhum livro ou artigo onde estejam resumidos em um só lugar (há Typeclassopedia, mas tem muitos de áreas que não estão bem cobertas). Alguém pode recomendar um artigo / livro que os cubra bem em um lugar e que possa ser acessível a um programador com habilidades intermediárias em FP?

Konstantin Solomatov
fonte
Não responde diretamente à sua pergunta, mas esta outra pergunta tem algumas informações interessantes (e pelo menos um link ou dois): stackoverflow.com/questions/327955/…
reuben
15
Você poderia expandir as áreas em que acha que a Typeclassopedia não cobre bem?
dave4420
2
@ dave4420 Se leio typeclassopedia do início ao fim, quanto mais leio, menos entendo. As primeiras seções são realmente boas, mas as últimas seções dificilmente são legíveis para mim.
Konstantin Solomatov
3
@KonstantinSolomatov pode ser que você precise pesquisar as seções que não entende, olhar as postagens do blog e examinar o código com atenção. todos esses "padrões de projeto" na typeclassopedia são, na verdade, abstrações, e geralmente profundas, que às vezes demoram para ser assimiladas.
jberryman
1
@DanBurton não tenho certeza se você interpretou mal meu comentário, mas eu classificaria todos eles como abstrações profundas, embora seja fácil esquecer isso quando você tem seu "Ah ha!" momento.
jberryman

Respostas:

35

Minha sugestão é, se você quiser aprender Scala, leia o livro de Paul Chiusano e Runar Bjarnason:

http://manning.com/bjarnason/

Parte II: Design funcional e bibliotecas combinadoras

  1. Fazendo pequenas linguagens
  2. Serialização JSON
  3. Teste baseado em especificações
  4. Analisadores
  5. Paralelismo puramente funcional
  6. Estado puramente funcional

Parte III: Padrões de design funcional

  1. O caso para abstração
  2. Monoids
  3. Functores
  4. Mônadas
  5. Functores aplicativos
  6. Estruturas de dados transversais e dobráveis
  7. Comonads

Parte IV: Quebrando as regras: efeitos e I / O

  1. Efeitos vs. efeitos colaterais
  2. Processamento de fluxo e E / S incremental
  3. Reforçando o escopo do efeito com o sistema de tipo
Edmondo1984
fonte
31

Desculpe, não sei de artigos ou livros que cobrem em detalhes os diferentes usos para todas essas construções, mas posso fornecer alguns links para recursos individuais.

Um padrão bastante comum é construir transformadores de mônadas em vez de mônadas simples (veja também o link no próximo parágrafo). Basicamente, significa que você constrói algo que deve ser combinado com outras mônadas, resultando em uma mais complexa, capaz de lidar com as características de ambas.

No Real World Haskell, existem alguns capítulos sobre mônadas. No Capítulo 14. Mônadas, os autores explicam os fundamentos e alguns usos comuns (talvez, lista, estado). O Capítulo 15. Programando com mônadas fornece mais explicações sobre como usá-las efetivamente (também cobre a mônada do leitor). O capítulo seguinte explica como usar o Parsec , mas pode ser mais interessante pesquisar artigos sobre como ele realmente funciona: deve ser um bom exemplo de um uso bem organizado de mônadas para análise. Fianlly, Capítulo 18. Transformadores de mônadaapresenta como funcionam os transformadores de mônada e, em seguida, mostra como construir um, passo a passo. As considerações para as seções finais do capítulo também são interessantes.

Eu li uma vez uma pergunta realmente interessante no SO sobre o uso criativo das mônadas . Os links propostos foram ótimas leituras sobre o assunto. Com esse espírito, tentei perguntar o mesmo para as flechas : definitivamente obtive menos respostas do que as das mônadas, mas mesmo assim interessantes.


Com relação aos padrões OOP pelo grupo de quatro, há um bom conjunto de 3 artigos da IBM sobre o tópico em sua série Pensamento funcional . A linguagem funcional de destino é Scala. Eles continuam explicando os padrões de design usuais em OOP e mostrando como eles são mapeados no Scala.

  1. Pensamento funcional: padrões de design funcional, parte 1 . Aqui, eles cobrem fábricas, métodos de modelo, estratégia, peso mosca. O ponto principal é que, tendo funções como valores de primeira classe, tudo é muito mais simples.
  2. Pensamento funcional: padrões de design funcional, parte 2 . Trata-se de java e groovy . Ele aborda o padrão do adaptador.
  3. Pensamento funcional: padrões de design funcional, parte 3 . Aqui, eles falam sobre o padrão do intérprete. Mais uma vez, o idioma de destino é descolado.

O artigo mais relevante para a sua pergunta é com certeza o primeiro, mas os outros dois podem ser leituras interessantes relacionadas.

Riccardo T.
fonte
Obrigado, mas quero dizer diferentes tipos de padrões, como Monad, Arrow, Applicative no GoF patterns.
Konstantin Solomatov
@KonstantinSolomatov: Percebi mal sua pergunta, desculpe. Eu adicionei algumas referências para mônadas e flechas.
Riccardo T.
18

Jeremy Gibbons tem um blog Patterns in FP que está destinado a se tornar o livro que você está pedindo. Claro, isso ainda não está em condições de ser tão útil quanto você gostaria agora, mas ele merece algum encorajamento!

Enquanto isso, direi +1 para a Typeclassopedia de Brent Yorgey. É muito útil, e se houver partes posteriores que confundam, este site é um bom lugar para ir até o fundo delas. Eu sei que Brent mantém tudo sob revisão. Se ele não estiver alcançando seus leitores, ajude-o.

trabalhador de porco
fonte
5

Você leu os últimos capítulos de Aprenda um Haskell para o Grande Bem ?

  • O Capítulo 6 cobre mapas e dobras, que são dois dos mais importantes "padrões de projeto" em linguagens funcionais.

  • Os capítulos 11-13 cobrem funções, funções aplicativas e mônadas, nessa ordem. Isso é útil - muitos tutoriais introduzem Functors e, em seguida, Monads e, em seguida, acrescentam Functors Aplicativos no final (se eles abordarem todos). A ordem em LYAH é melhor, porque mover-se de Functores => Funções Aplicativas => Mônadas o move gradualmente para cima na escada da generalidade e do poder.

  • O Capítulo 14 cobre os Zíperes - você pode efetivamente pensar neles como classes de contêiner com um ponteiro para um dado específico, o que significa que você obtém acesso O (1) e atualiza na localização do ponteiro.

Não cobre Arrows ou Comonads, que são um tópico mais avançado em Haskell. Para entender como e por que usar Arrows ou Comonads, você definitivamente já deve ter um bom domínio das Mônadas, então não acho que isso seja um problema - LYAH está firmemente voltado para o segmento iniciante do mercado de Haskell.

Chris Taylor
fonte
1
Sim, eu li o livro. Eu gostei muito disso. Infelizmente, ele não esconde flechas e muitos outros padrões avançados. Também quero ler mais sobre Mônadas e Aplicativos (por exemplo, LYHGG não cobre a mônada de continuação).
Konstantin Solomatov