สำนวน“ flatmap that s ***” ใน Scala มาจากไหน?


104

อะไรคือสิ่งที่ทรงพลังเกี่ยวกับแฟลตแมปที่สมควรได้รับสถานที่เช่นนี้ในคติชนวิทยาของสกาล่า?


30
[ต้องการอ้างอิง]
tstenner

1
อ่านหัวข้อเกี่ยวกับวิธีที่คอมไพลเลอร์จัดการกับforนิพจน์ในการอ้างอิงภาษา อาจให้คำแนะนำบางอย่าง
Dirk

@tstenner: ตราบใดที่เรายังพึ่งพามีมสั้น ๆ : Google คือเพื่อนของคุณ
Chuck

4
@aishwarya มันเหมือนกับ "แค่ใช้แฟลตแมปในรายการ / อาร์เรย์ / ตัวเลือกของคุณ" ไม่ใช่ "ขี้" เหมือนใน "ไม่ดี"
tstenner

1
จริงๆแล้ววลีเฉพาะนั้น (แน่นอน) ถูกนำออกจากบริบทซึ่งมีคนพลาด Bar (Reader) monad ที่ไหนสักแห่งในแมนฮัตตัน ;-) เมื่อมันเกิดขึ้นในกรณีเช่นนี้เวอร์ชันสั้น ๆ ก็ติดอยู่
Roland Kuhn

คำตอบ:


56

เหตุผลที่อยู่เบื้องหลังวลีนี้คือคุณสามารถแทนที่โค้ด if / then / else ที่น่าเบื่อมากมายที่คุณจะเขียนด้วยการเรียกไปที่ flatMap (และฟังก์ชันลำดับที่สูงกว่าอื่น ๆ )

โดยเฉพาะอย่างยิ่งสำหรับตัวเลือก (ดูhttp://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )

แต่มันก็ใช้ได้กับ monads อื่น ๆ เช่นกัน (แม้ว่าฉันต้องยอมรับว่าฉันยังไม่เข้าใจรายละเอียดทั้งหมดด้วยตัวเอง)

ลองนึกภาพสถานการณ์ที่คุณมีคอลเล็กชันที่คุณต้องการใช้ฟังก์ชัน (หรือชุดของฟังก์ชัน) ซึ่งแต่ละฟังก์ชันอาจส่งคืนค่าว่าง เมื่อคุณใช้ null จริงคุณโค้ดจะถูกตรวจสอบด้วย null แต่ถ้าคุณใช้ตัวเลือกแทนค่าคุณก็สามารถทำแผนที่ค่าด้วยฟังก์ชันที่ต้องการให้แบนแมปผูกมัดฟังก์ชันในกรณีที่มีหลายฟังก์ชันและรับคอลเล็กชันที่มีเพียงผลลัพธ์ที่ไม่เป็นโมฆะซึ่งในหลาย ๆ กรณีก็เป็นเช่นนั้น คุณต้องการ.

เนื่องจากคำอธิบายดังกล่าวค่อนข้างซับซ้อนคำแนะนำสั้น ๆ "แค่แฟลตแมปที่ขี้" จึงสร้างขึ้นเอง


ฉันเองใช้รายการ monad ในบางครั้งเพื่อจัดการกับชุดค่าผสม
Dan Burton

103

เรื่องราวที่ฉันได้ยินคือโปรแกรมเมอร์ Scala ที่มีชื่อเสียงสองคนกำลังจับคู่กันเมื่อหนึ่งในนั้นเริ่มเขียนโค้ดเช่นนี้:

option match {
    case Some ...

เมื่อถึงจุดใดอีกคนก็พูดว่า "นี่อะไรน่ะชั่วโมงสมัครเล่นแผนที่แบบแบนที่อึ!"

สิ่งที่ทรงพลังflatMapนั้นดี ... ประการแรกมันเป็นตัวดำเนินการโมนาดิคพื้นฐาน นั่นหมายความว่าเป็นการดำเนินการร่วมกันที่ใช้ร่วมกันตัวอย่างเช่นคอนเทนเนอร์ (เช่นOptionคอลเลกชัน ฯลฯ ) การต่อเนื่องสถานะ ฯลฯ ประการที่สองในขณะที่คุณสามารถยกเลิกการสร้างสิ่งOptionที่ตรงข้ามกับflatMapการดำเนินการแบบ monadic ไม่ได้ ดังนั้นจึงไม่สามารถนำไปใช้ในวงกว้างได้ นอกจากนี้ยังต้องใช้ความรู้มากเกินไปเกี่ยวกับข้อมูลที่คุณกำลังจัดการ

หมายเหตุ: ก่อนหน้านี้ฉันบอกว่าการจับคู่ช้ากว่าflatMap- ตรงกันข้ามเป็นจริงตามความเป็นจริงจนถึงเวอร์ชันล่าสุดของ Scala ในขณะที่เขียนนี้คือ 2.10.1)


4
ฉันเดาว่าฉันยังอยู่ในชั่วโมงสมัครเล่น :-)
Guillaume Belrose

69
โปรแกรมเมอร์สองคนนั้นคือตัวฉันและ Paul Chiusano
Apocalisp

1
ถ้าฉันจำได้อย่างถูกต้อง #legendofklang ไม่ได้แสดงตัวเองบน Twitter ในเวลาเดียวกัน ... เราควรสร้างรายการ Scala meme wiki บางประเภท ตอนนี้มีบางตัวที่ยอดเยี่ยม!
ทิโมธี

3
@ WillSargent ฉันคิดว่ามันหายไปจากป่าสำหรับต้นไม้ ข้อดีก็คือว่ามันประกอบด้วย ถ้าฉันมีฟังก์ชันที่ขึ้นอยู่กับสี่ monads ฉันสามารถเขียนval res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)ได้ ฉันสามารถเพิ่ม monads ลบ monads และมันก็ยังคงเหมือนเดิม นอกจากนี้ยังทราบว่ามันไม่ได้สลายตัวลงไปลงไปแต่ลงไปในString Option[String]แม้ว่าจริงๆแล้วมันไม่ได้ย่อยสลายเลย สาเหตุหนึ่งที่บางคนไม่ชอบใช้ตู้คอนเทนเนอร์เป็นตัวอย่างสำหรับ monads คือคุณสามารถนำของออกจากตู้คอนเทนเนอร์ได้ แต่ไม่ใช่ทุกคนที่ยอมให้คุณทำเช่นนั้น
Daniel C. Sobral

1
คุณสามารถดูลิงก์ไปยังการอภิปรายที่อ้างถึงได้ที่นี่: web.archive.org/web/20130627111326/http://beust.com/weblog/2010/…
hawkeye

12

สิ่งที่สำคัญเกี่ยวกับการflatMapที่ Scala เป็นตัวแทนของการดำเนินการผูกแบบ monadic มีบทเรียนมากมายบนเว็บที่อธิบายจุดประสงค์ของ monads และเหตุใดจึงมีประโยชน์มาก James Iry มีสิ่งหนึ่งที่กล่าวถึงรายละเอียดบางอย่าง


4
ฉันคิดว่านี่เป็นคำตอบที่ถูกต้องOptionเป็นเพียงหนึ่งในหลาย ๆflatMapกรณีการใช้งาน แน่นอนถ้าคุณต้องการสังเกตสัตว์ประหลาดใน "ที่อยู่อาศัยตามธรรมชาติ" ของพวกมันคุณควรตรวจสอบ Haskell ความแตกต่างเพียงอย่างเดียวคือ Haskellers พูดว่า: "Just >> = that shit!"
Landei

ขอบคุณสำหรับลิงก์ไปยังบทความฉันพบว่ามีประโยชน์มาก ฉันยังกลับไปที่บท "สำหรับการเยี่ยมชมนิพจน์อีกครั้ง" ใน Programming in Scala ซึ่งจะช่วยให้เกิดการวนซ้ำและการใช้ตัวกรองแผนที่ flatMap และการทำให้แบนราบ
Guillaume Belrose

10

Runar Bjarnason คือบุคคลที่คุณกำลังมองหาต้นกำเนิด

การตระหนักว่าเหตุใดจึงมีพลังมากจึงเป็นสิ่งที่เกิดขึ้นได้เมื่อต้องซื่อสัตย์ คลาสตัวเลือกเป็นจุดเริ่มต้นที่ดีที่สุดในการดูว่าคุณจะแบนแมปชุดการค้นหาซ้ำ ๆ (เช่น) ในผลลัพธ์สุดท้ายได้อย่างไร

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