อะไรคือสิ่งที่ทรงพลังเกี่ยวกับแฟลตแมปที่สมควรได้รับสถานที่เช่นนี้ในคติชนวิทยาของสกาล่า?
for
นิพจน์ในการอ้างอิงภาษา อาจให้คำแนะนำบางอย่าง
อะไรคือสิ่งที่ทรงพลังเกี่ยวกับแฟลตแมปที่สมควรได้รับสถานที่เช่นนี้ในคติชนวิทยาของสกาล่า?
for
นิพจน์ในการอ้างอิงภาษา อาจให้คำแนะนำบางอย่าง
คำตอบ:
เหตุผลที่อยู่เบื้องหลังวลีนี้คือคุณสามารถแทนที่โค้ด if / then / else ที่น่าเบื่อมากมายที่คุณจะเขียนด้วยการเรียกไปที่ flatMap (และฟังก์ชันลำดับที่สูงกว่าอื่น ๆ )
โดยเฉพาะอย่างยิ่งสำหรับตัวเลือก (ดูhttp://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )
แต่มันก็ใช้ได้กับ monads อื่น ๆ เช่นกัน (แม้ว่าฉันต้องยอมรับว่าฉันยังไม่เข้าใจรายละเอียดทั้งหมดด้วยตัวเอง)
ลองนึกภาพสถานการณ์ที่คุณมีคอลเล็กชันที่คุณต้องการใช้ฟังก์ชัน (หรือชุดของฟังก์ชัน) ซึ่งแต่ละฟังก์ชันอาจส่งคืนค่าว่าง เมื่อคุณใช้ null จริงคุณโค้ดจะถูกตรวจสอบด้วย null แต่ถ้าคุณใช้ตัวเลือกแทนค่าคุณก็สามารถทำแผนที่ค่าด้วยฟังก์ชันที่ต้องการให้แบนแมปผูกมัดฟังก์ชันในกรณีที่มีหลายฟังก์ชันและรับคอลเล็กชันที่มีเพียงผลลัพธ์ที่ไม่เป็นโมฆะซึ่งในหลาย ๆ กรณีก็เป็นเช่นนั้น คุณต้องการ.
เนื่องจากคำอธิบายดังกล่าวค่อนข้างซับซ้อนคำแนะนำสั้น ๆ "แค่แฟลตแมปที่ขี้" จึงสร้างขึ้นเอง
เรื่องราวที่ฉันได้ยินคือโปรแกรมเมอร์ Scala ที่มีชื่อเสียงสองคนกำลังจับคู่กันเมื่อหนึ่งในนั้นเริ่มเขียนโค้ดเช่นนี้:
option match {
case Some ...
เมื่อถึงจุดใดอีกคนก็พูดว่า "นี่อะไรน่ะชั่วโมงสมัครเล่นแผนที่แบบแบนที่อึ!"
สิ่งที่ทรงพลังflatMap
นั้นดี ... ประการแรกมันเป็นตัวดำเนินการโมนาดิคพื้นฐาน นั่นหมายความว่าเป็นการดำเนินการร่วมกันที่ใช้ร่วมกันตัวอย่างเช่นคอนเทนเนอร์ (เช่นOption
คอลเลกชัน ฯลฯ ) การต่อเนื่องสถานะ ฯลฯ ประการที่สองในขณะที่คุณสามารถยกเลิกการสร้างสิ่งOption
ที่ตรงข้ามกับflatMap
การดำเนินการแบบ monadic ไม่ได้ ดังนั้นจึงไม่สามารถนำไปใช้ในวงกว้างได้ นอกจากนี้ยังต้องใช้ความรู้มากเกินไปเกี่ยวกับข้อมูลที่คุณกำลังจัดการ
หมายเหตุ: ก่อนหน้านี้ฉันบอกว่าการจับคู่ช้ากว่าflatMap
- ตรงกันข้ามเป็นจริงตามความเป็นจริงจนถึงเวอร์ชันล่าสุดของ Scala ในขณะที่เขียนนี้คือ 2.10.1)
val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)
ได้ ฉันสามารถเพิ่ม monads ลบ monads และมันก็ยังคงเหมือนเดิม นอกจากนี้ยังทราบว่ามันไม่ได้สลายตัวลงไปลงไปแต่ลงไปในString
Option[String]
แม้ว่าจริงๆแล้วมันไม่ได้ย่อยสลายเลย สาเหตุหนึ่งที่บางคนไม่ชอบใช้ตู้คอนเทนเนอร์เป็นตัวอย่างสำหรับ monads คือคุณสามารถนำของออกจากตู้คอนเทนเนอร์ได้ แต่ไม่ใช่ทุกคนที่ยอมให้คุณทำเช่นนั้น
สิ่งที่สำคัญเกี่ยวกับการflatMap
ที่ Scala เป็นตัวแทนของการดำเนินการผูกแบบ monadic มีบทเรียนมากมายบนเว็บที่อธิบายจุดประสงค์ของ monads และเหตุใดจึงมีประโยชน์มาก James Iry มีสิ่งหนึ่งที่กล่าวถึงรายละเอียดบางอย่าง
Option
เป็นเพียงหนึ่งในหลาย ๆflatMap
กรณีการใช้งาน แน่นอนถ้าคุณต้องการสังเกตสัตว์ประหลาดใน "ที่อยู่อาศัยตามธรรมชาติ" ของพวกมันคุณควรตรวจสอบ Haskell ความแตกต่างเพียงอย่างเดียวคือ Haskellers พูดว่า: "Just >> = that shit!"
Runar Bjarnason คือบุคคลที่คุณกำลังมองหาต้นกำเนิด
การตระหนักว่าเหตุใดจึงมีพลังมากจึงเป็นสิ่งที่เกิดขึ้นได้เมื่อต้องซื่อสัตย์ คลาสตัวเลือกเป็นจุดเริ่มต้นที่ดีที่สุดในการดูว่าคุณจะแบนแมปชุดการค้นหาซ้ำ ๆ (เช่น) ในผลลัพธ์สุดท้ายได้อย่างไร