Quiero estudiar FRP en Haskell, pero es un poco difícil decidir qué biblioteca utilizar. Muchos parecen ser intentos muertos, algunos parecen haber resucitado (como la actividad reciente en Yampa).
Por lo que leí, parece que hay dos "tipos" de FRP: FRP push-pull (como en Reactive-banana) en un lado y FRP en flecha (como en Yampa) en el otro lado. Parece que también solía haber algún "FRP clásico" en el momento de Fran y FrTime, pero no he visto ninguna actividad reciente en estos.
¿Son estos dos (o tres) enfoques realmente diferentes de FRP?
¿Es una de ellas una teoría desactualizada mientras que la otra sería el "material del futuro"?
¿O tienen que evolucionar en paralelo, abordando diferentes propósitos?
¿Mencioné la biblioteca más destacada de cada categoría o hay otras opciones a considerar (Sodium, Netwire, et al)?
Finalmente vi la charla de Evan Czaplicki recomendada en los comentarios de J. Abrahamson. Es muy interesante y me ayudó a aclarar las cosas. Se lo recomiendo a cualquiera que encuentre esta pregunta interesante.
fuente
reactive-banana
definitivamente está basado en pull no pull-pull.reactive
es push-pull.Yampa
ynetwire
están en flecha. Hay FRP que permiten "acumular valores" pero no permiten "conmutar", FRP que permiten "conmutar" pero no "acumular valores". Ambos son FRP "simples". Arrowized FRP permite cambiar y acumular y usa flechas para controlar el peligro de combinar esas características. Monadic FRP gustareactive-banana
,sodium
yelerea
usa otros mecanismos cuidadosos para asegurar que el cambio y la acumulación no interactúen demasiado.Respuestas:
Hice un viaje a Haskell.org para investigar su pregunta. Lo que encontré son dos documentos importantes que debe leer para ampliar su investigación, y estoy construyendo mi respuesta a su pregunta a partir de estos documentos académicos.
Push-Pull FRP de Conal Elliott
Generalizando las mónadas a las flechas por John Hughes
Sí, pero también no. Según Elliot, el empuje es una evaluación de FRP basada en datos y el tirón se relaciona con lo que se llama evaluación dirigida por "demanda". El autor recomienda pull porque push tiende a estar inactivo entre las entradas de datos. Aquí está el quid: el push-pull combina y equilibra estos comportamientos con el objetivo principal de minimizar la necesidad de recalcular los valores. Es sencillo; operar FRP con push-pull acelera la capacidad de reacción. Arrow es una técnica diferente para usar tipos abstractos para vincular valores y evaluarlos simultáneamente. Todos estos conceptos son fundamentalmente diferentes. Pero no confíes en mi palabra:
Por lo tanto, Arrow contradice el objetivo de push-pull. Eso no significa que no pueda usar todo esto a la vez, solo que sería complejo, y hay algunas cosas que no puede calcular sin los tipos abstractos de Flecha.
No he encontrado opiniones académicas sobre qué enfoques son "el camino del futuro". Solo tenga en cuenta que las flechas pueden manejar la simultaneidad particularmente bien. Si pudiera implementar flechas y usar push-pull para minimizar los cálculos, ese sería el camino hacia el futuro.
Sí, abordan propósitos separados. Como dije, se pueden formular juntos, pero es difícil de implementar e incluso si funciona, probablemente negaría los beneficios de la velocidad de reacción del empuje-arrastre.
Eso es subjetivo, pero Reactive y Yampa parecen ser las bibliotecas de idiomas más comúnmente citadas para FRP. Diría que Reactive by Conal Elliott tiene raíces profundas, y Yampa también está establecida. Otros proyectos como Netwire surgieron como reemplazos, pero podría pasar un tiempo antes de que reemplacen a los gigantes.
¡Espero que esto ayude! Como dije al leer los artículos que señalé le dará una mejor idea de la distancia semántica entre flecha, empujar y tirar.
fuente