ฉันรู้ว่าฉันมางานปาร์ตี้ช้า แต่คุณมีคำตอบทางทฤษฎีสองข้อที่นี่และฉันต้องการให้ทางเลือกที่เป็นประโยชน์แก่การเคี้ยวมากกว่า ฉันมาที่นี่ในฐานะผู้เยาว์ Haskell ที่ยังไม่ได้รับการเดินขบวนในหัวข้อ Arrows สำหรับโครงการที่ฉันกำลังทำอยู่
ก่อนอื่นคุณสามารถแก้ไขปัญหาส่วนใหญ่ใน Haskell ได้อย่างมีประสิทธิภาพโดยไม่ต้องใช้ Arrows บาง Haskellers ที่โดดเด่นอย่างแท้จริงไม่ชอบและไม่ใช้พวกเขา (ดูที่นี่ , ที่นี่และที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้) ดังนั้นหากคุณกำลังพูดกับตัวเอง "เฮ้ฉันไม่ต้องการสิ่งเหล่านี้" เข้าใจว่าคุณอาจถูกต้องอย่างแท้จริง
สิ่งที่ฉันพบว่าน่าผิดหวังมากที่สุดเกี่ยวกับลูกศรเมื่อฉันเรียนรู้ครั้งแรกนั้นคือวิธีที่บทเรียนมาถึงเรื่องการเปรียบเทียบวงจรอย่างหลีกเลี่ยงไม่ได้ หากคุณดูที่รหัสลูกศร - ความหลากหลายที่น่าสนใจอย่างน้อยมันก็ไม่ได้คล้ายกับภาษา Defnition มากนัก อินพุตของคุณจัดเรียงทางด้านขวาเอาท์พุทของคุณทางด้านซ้ายและหากคุณล้มเหลวในการวางสายทั้งหมดให้ถูกต้อง ฉันคิดกับตัวเอง: จริงเหรอ? นี่คือสิ่งที่เราได้ลงเอย? เราได้สร้างภาษาระดับสูงอย่างสมบูรณ์ซึ่งประกอบด้วยสายทองแดงและบัดกรีอีกครั้งหรือไม่
คำตอบที่ถูกต้องสำหรับสิ่งนี้เท่าที่ฉันสามารถระบุได้คือ: จริงๆแล้วใช่ กรณีการใช้งานนักฆ่าตอนนี้สำหรับ Arrows คือ FRP (คิดว่าแยมเกมเพลงและระบบตอบโต้โดยทั่วไป) ปัญหาที่เผชิญหน้ากับ FRP นั้นส่วนใหญ่เป็นปัญหาเดียวกันที่หันหน้าไปทางระบบส่งข้อความแบบซิงโครนัสอื่น ๆ ทั้งหมด: วิธีเชื่อมต่อสตรีมอินพุตอย่างต่อเนื่องเข้ากับสตรีมเอาต์พุตต่อเนื่องโดยไม่ต้องวางข้อมูลที่เกี่ยวข้องหรือรั่วไหล คุณสามารถสร้างแบบจำลองลำธารเป็นรายการ - ระบบ FRP ล่าสุดหลายระบบใช้วิธีนี้ - แต่เมื่อคุณมีรายการอินพุตจำนวนมากแทบจะเป็นไปไม่ได้ที่จะจัดการ คุณต้องป้องกันตัวเองจากปัจจุบัน
สิ่งที่ลูกศรอนุญาตให้ใช้ในระบบ FRP คือองค์ประกอบของฟังก์ชั่นเข้าสู่เครือข่ายในขณะเดียวกันก็สามารถแยกการอ้างอิงใด ๆ ไปยังค่าพื้นฐานที่ถูกส่งผ่านโดยฟังก์ชันเหล่านั้น หากคุณยังใหม่กับ FP สิ่งนี้อาจสร้างความสับสนในตอนแรกและจากนั้นก็เหลือเชื่อเมื่อคุณดูดซับความหมายของมัน คุณได้ดูดซึมได้เพียงไม่นานความคิดที่ว่าฟังก์ชั่นจะใจลอยและวิธีการที่จะเข้าใจรายการเช่นเป็นประเภท[(*), (+), (-)]
[(a -> a -> a)]
ด้วย Arrows คุณสามารถเพิ่ม Abstraction หนึ่งเลเยอร์ต่อไป
ความสามารถเพิ่มเติมนี้ในการทำให้เป็นนามธรรมดำเนินไปด้วยอันตรายของตัวเอง สำหรับสิ่งหนึ่งมันสามารถผลัก GHC ลงในกล่องมุมซึ่งไม่ทราบว่าจะต้องทำอย่างไรกับสมมติฐานประเภทของคุณ คุณจะต้องเตรียมพร้อมที่จะคิดในระดับประเภท - นี่เป็นโอกาสที่ยอดเยี่ยมในการเรียนรู้เกี่ยวกับชนิดและอันดับเอ็นไทม์และหัวข้ออื่น ๆ
นอกจากนี้ยังมีตัวอย่างจำนวนหนึ่งของสิ่งที่ฉันเรียกว่า "Stupid Arrow Stunts" ที่ตัวเข้ารหัสสำหรับ Arrow Arrow combinator เพียงเพราะเขาหรือเธอต้องการที่จะแสดงกลอุบายกับ tuples (นี่คือสิ่งที่ฉันทำกับความบ้าคลั่งเล็กน้อย) รู้สึกอิสระที่จะเพิกเฉยต่อฮ็อตด็อกดังกล่าวเมื่อคุณเจอมันในป่า
หมายเหตุ: ตามที่ฉันได้กล่าวไว้ข้างต้น หากฉันประกาศใช้ความเข้าใจผิดใด ๆ ข้างต้นโปรดแก้ไขให้ถูกต้อง