Quero estudar FRP em Haskell, mas é um pouco difícil decidir sobre uma biblioteca a ser usada. Muitos parecem tentativas mortas, alguns parecem ter ressuscitado (como atividades recentes em Yampa).
Pelo que li, parece que existem dois "tipos" de FRP: FRP push-pull (como em banana reativa) de um lado e FRP com seta (como em Yampa) do outro lado. Parece que também costumava haver "FRP clássico" na época de Fran e FrTime, mas não vi nenhuma atividade recente nelas.
Essas duas (ou três) abordagens são realmente fundamentalmente diferentes da FRP?
Um deles é uma teoria ultrapassada, enquanto o outro seria o "material do futuro"?
Ou eles precisam evoluir em paralelo, abordando diferentes propósitos?
Eu nomeei a biblioteca mais importante de cada categoria ou existem outras opções a considerar (Sodium, Netwire, et al)?
Finalmente assisti à palestra de Evan Czaplicki recomendada nos comentários de J. Abrahamson. É muito interessante e ajudou a esclarecer as coisas para mim. Eu recomendo para quem achou esta pergunta interessante.
fonte
reactive-banana
é definitivamente baseado em pull e não push-pull.reactive
é push-pull.Yampa
enetwire
estão em seta. Existem FRPs que permitem "acumular valores" mas não permitem "alternar", FRPs que permitem "alternar" mas não "acumular valores". Ambos são FRP "simples". O FRP com seta permite alternar e acumular e usa setas para controlar o perigo de combinar esses recursos. O FRP monádicoreactive-banana
, como,,sodium
eelerea
usa outros mecanismos cuidadosos para garantir que a troca e a acumulação não interajam demais.Respostas:
Fiz uma viagem ao Haskell.org para investigar sua pergunta. O que encontrei foram dois artigos importantes que você deveria ler para aprofundar sua pesquisa e estou construindo minha resposta à sua pergunta a partir desses artigos acadêmicos.
Push-Pull FRP por Conal Elliott
Generalizando Mônadas em Setas por John Hughes
Sim, mas também não. De acordo com Elliot, o push é a avaliação de FRP orientada por dados e o pull está relacionado ao que é chamado de avaliação orientada por "demanda". O autor recomenda pull, porque o push tende a ficar ocioso entre as entradas de dados. Aqui está o ponto crucial: o push-pull combina e equilibra esses comportamentos com o objetivo principal de minimizar a necessidade de recalcular valores. É simples; operar FRP com push-pull acelera a capacidade de reagir. Arrow é uma técnica diferente para usar tipos abstratos para vincular valores e avaliá-los simultaneamente. Todos esses conceitos são fundamentalmente diferentes. Mas não aceite minha palavra:
Assim, Arrow contradiz o objetivo do push-pull. Isso não significa que você não pode usar tudo isso de uma só vez, apenas que seria complexo, e há algumas coisas que você não pode calcular sem os tipos abstratos de Arrow.
Não encontrei opiniões acadêmicas sobre quais abordagens são "o caminho do futuro". Observe apenas que as setas podem lidar particularmente bem com a simultaneidade. Se você pudesse implementar setas e usar push-pull para minimizar os cálculos, esse seria o caminho do futuro.
Sim, eles abordam propósitos separados. Como eu disse, eles podem ser formulados juntos, mas é difícil de implementar e, mesmo que funcione, provavelmente negaria os benefícios de velocidade reativa do push-pull.
Isso é subjetivo, mas Reactive e Yampa parecem ser as bibliotecas de idiomas mais citadas para o FRP. Eu diria que a Reactive de Conal Elliott tem raízes profundas e a Yampa também está estabelecida. Outros projetos como o Netwire surgiram como substitutos, mas pode demorar um pouco até que eles substituam os gigantes.
Espero que isto ajude! Como eu disse, ao ler os artigos que apontei, você terá uma melhor noção da distância semântica entre flecha, empurrar e puxar.
fonte