ความสามารถในการผลักและดึง FRP แบบพื้นฐานแตกต่างกันอย่างไร


264

ฉันต้องการเรียน FRP ใน Haskell แต่มันค่อนข้างยากที่จะตัดสินใจใช้ห้องสมุด หลายคนดูเหมือนจะพยายามตายบางคนดูเหมือนจะฟื้นคืนชีพ (เช่นกิจกรรมล่าสุดในแยมปา)

จากสิ่งที่ฉันอ่านดูเหมือนว่ามี "ชนิด" ของ FRP อยู่สองแบบ: push-pull FRP (เช่น Reactive-Banana) ที่ด้านหนึ่งและ FRP arrowized (เหมือนใน Yampa) ที่อยู่อีกด้านหนึ่ง ดูเหมือนว่ามันเคยเป็น "FRP แบบคลาสสิค" ในเวลาของ Fran และ FrTime แต่ฉันไม่ได้เห็นกิจกรรมล่าสุดในสิ่งเหล่านี้

  • สองหรือสามวิธีนี้ต่างกันจริงๆของ FRP หรือไม่

  • หนึ่งในนั้นคือทฤษฎีที่ล้าสมัยในขณะที่อีกอันจะเป็น "สิ่งของแห่งอนาคต"?

  • หรือพวกเขาจะต้องพัฒนาไปพร้อม ๆ กันเพื่อบอกจุดประสงค์ที่แตกต่างกัน?

  • ฉันตั้งชื่อห้องสมุดที่โดดเด่นที่สุดของแต่ละหมวดหมู่หรือมีตัวเลือกอื่น ๆ ให้พิจารณา (Sodium, Netwire, et al) หรือไม่


ในที่สุดฉันก็ดูคำปราศรัยจาก Evan Czaplickiแนะนำในความคิดเห็นโดยเจ Abrahamson มันน่าสนใจมากและช่วยอธิบายสิ่งต่าง ๆ ให้ฉัน ฉันขอแนะนำให้ทุกคนที่พบคำถามนี้น่าสนใจ


5
คุณอาจสนใจในความคิดเห็นของ ertes '(ผู้แต่ง netwire): stackoverflow.com/a/13344292/414413
Cirdec

14
เร็วจริง ๆ : reactive-bananaเป็นแบบ pull-based ไม่ใช่แบบ push-pull reactiveเป็นแบบผลัก Yampaและnetwireมีลูกศร มี FRP ที่อนุญาตให้ "สะสมค่า" แต่ไม่อนุญาตให้ "สลับ", FRP ที่อนุญาตให้ "สลับ" แต่ไม่ "สะสมค่า" ทั้งคู่เป็น FRP "แบบง่าย" Arrowized FRP ช่วยให้สามารถสลับและสะสมและใช้ลูกศรเพื่อควบคุมอันตรายของการรวมคุณสมบัติเหล่านั้น Monadic FRP เป็นเช่นreactive-bananaนั้นsodiumและelereaใช้กลไกที่ระมัดระวังอื่น ๆ เพื่อให้แน่ใจว่าการสลับและการสะสมไม่ได้มีปฏิสัมพันธ์มากเกินไป
J. Abrahamson

12
Arrowized FRP ยังมีคุณสมบัติที่เป็นระเบียบที่สัญญาณจะถูกระบุในบริบทของอินพุตซึ่งช่วยให้คุณสามารถแปลงเอาต์พุต covariantly และอินพุตต่าง ๆ เพื่อให้จำลอง FRP เชิงโต้ตอบได้ดียิ่งขึ้น ดูอินเทอร์เฟซผู้ใช้ที่ใช้งานได้จริงโดย Courtney และ Elliott สำหรับตัวอย่างที่ยอดเยี่ยมของคุณสมบัตินั้น
J. Abrahamson

9
คุณอาจสนใจในการพูดคุย"การควบคุมเวลาและพื้นที่"โดย Elm ผู้เขียน Evan Czaplicki ในความคิดของฉันเขาจัดการเพื่อให้ภาพรวมระดับสูงดีกว่าพื้นที่การออกแบบ FRP และการประนีประนอมที่เกี่ยวข้อง
DanielM

3
ฉันคิดว่าคุณจะได้รับคำตอบของคุณที่นี่ .. stackoverflow.com/questions/10000074/…
Rushabh Shah

คำตอบ:


17

ฉันเดินทางไปที่ Haskell.org เพื่อตรวจสอบคำถามของคุณสิ่งที่ฉันพบคือเอกสารสำคัญสองข้อที่คุณควรอ่านเพื่อทำการวิจัยเพิ่มเติมและฉันกำลังสร้างคำตอบให้กับคำถามของคุณจากเอกสารวิชาการเหล่านี้

Push-Pull FRP โดย Conal Elliott

Generalising Monads to Arrows โดย John Hughes


  1. ใช่ แต่ยังไม่ จากข้อมูลของ Elliot การผลักดันคือการประเมิน FRP และการดึงข้อมูลเกี่ยวข้องกับสิ่งที่เรียกว่า ผู้เขียนแนะนำให้ดึงเนื่องจากการพุชมีแนวโน้มที่จะไม่ได้ทำงานระหว่างอินพุตข้อมูล นี่คือ crux: push-pullรวมและปรับสมดุลพฤติกรรมเหล่านี้เพื่อวัตถุประสงค์หลักในการลดความต้องการในการคำนวณค่าใหม่ มันง่ายมาก การใช้งาน FRP ด้วยการกดดึงจะช่วยเพิ่มความสามารถในการตอบสนอง Arrowเป็นเทคนิคที่แตกต่างกันสำหรับการใช้ประเภทนามธรรมเพื่อเชื่อมโยงค่าและประเมินพร้อมกัน แนวคิดทั้งหมดนี้มีความแตกต่างกันโดยพื้นฐาน แต่อย่าใช้คำของฉันมัน:

    ลักษณะของอินเทอร์เฟซ Arrow เป็นปัญหาสำหรับเป้าหมายของการประเมินใหม่อีกครั้ง กิจกรรมอินพุตและพฤติกรรมจะถูกรวมเข้าเป็นอินพุตเดียวซึ่งจะเปลี่ยนแปลงทุกครั้งที่มีการเปลี่ยนแปลงองค์ประกอบ (เอลเลียต)

    ดังนั้น Arrow จะขัดแย้งกับเป้าหมายของการดึง ไม่ได้หมายความว่าคุณไม่สามารถใช้สิ่งเหล่านี้ทั้งหมดได้ในครั้งเดียว แต่มันจะซับซ้อนและมีบางสิ่งที่คุณไม่สามารถคำนวณได้หากไม่มีประเภทลูกศรที่เป็นนามธรรม

  2. ฉันไม่พบความคิดเห็นเชิงวิชาการเกี่ยวกับวิธีการที่เป็น "เส้นทางแห่งอนาคต" ทราบเพียงว่าลูกศรสามารถจัดการพร้อมกันโดยเฉพาะอย่างยิ่งดี หากคุณสามารถใช้ลูกศรและใช้ push-pull เพื่อลดการคำนวณนั่นจะเป็นแนวทางในอนาคต

  3. ใช่พวกเขากล่าวถึงวัตถุประสงค์ที่แยกต่างหาก ดังที่ฉันได้กล่าวมาพวกเขาสามารถสร้างสูตรร่วมกันได้ แต่มันยากที่จะนำไปใช้และแม้ว่ามันจะทำงานได้ แต่ก็อาจลบล้างผลประโยชน์ความเร็วปฏิกิริยาของ push-pull

  4. เป็นเรื่องส่วนตัว แต่ Reactive และ Yampa นั้นดูเหมือนจะเป็นห้องสมุดภาษาที่ถูกอ้างถึงมากที่สุดสำหรับ FRP ฉันจะบอกว่าปฏิกิริยาโดย Conal Elliott มีรากฐานที่ลึกและ Yampa ก็เป็นที่ยอมรับเช่นกัน โครงการอื่น ๆ เช่น Netwire เกิดขึ้นแทน แต่มันอาจเป็นสักครู่ก่อนที่พวกเขาจะเปลี่ยนยักษ์


หวังว่านี่จะช่วยได้! เช่นเดียวกับที่ฉันบอกว่าการอ่านบทความที่ฉันชี้ให้เห็นจะทำให้คุณรู้สึกถึงความหมายที่ดีขึ้นระหว่างลูกศรกดและดึง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.