รูปแบบการออกแบบตามหน้าที่ [ปิด]


106

มีสำนวนการใช้งานมากมาย: monads แอพพลิเคชั่นลูกศร ฯลฯ พวกเขาได้รับการบันทึกไว้ในบทความต่างๆ แต่น่าเสียดายที่ฉันไม่รู้จักหนังสือหรือบทความใด ๆ ที่พวกเขาสรุปไว้ในที่เดียว (มีTypeclassopediaแต่มีจำนวนมาก ของพื้นที่ที่ไม่ครอบคลุม) ใครช่วยแนะนำบทความ / หนังสือที่ครอบคลุมได้ดีในที่เดียวและเรื่องไหนที่โปรแกรมเมอร์ที่มีทักษะระดับกลางใน FP สามารถเข้าถึงได้


ไม่ได้ตอบคำถามของคุณโดยตรง แต่คำถามอื่น ๆ นี้มีข้อมูลที่น่าสนใจ (และอย่างน้อยก็ลิงก์หรือสองลิงก์): stackoverflow.com/questions/327955/…
reuben

15
คุณช่วยขยายพื้นที่ที่คุณรู้สึกว่า Typeclassopedia ไม่ครอบคลุมได้หรือไม่?
dave4420

2
@ dave4420 ถ้าฉันอ่าน typeclassopedia ตั้งแต่ต้นจนจบยิ่งอ่านมากฉันก็ยิ่งเข้าใจน้อยลง ส่วนแรกดีมาก แต่ส่วนหลัง ๆ แทบจะไม่สามารถอ่านได้สำหรับฉัน
Konstantin Solomatov

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

1
@DanBurton ไม่แน่ใจว่าคุณอ่านความคิดเห็นของฉันผิดหรือเปล่า แต่ฉันจะจัดหมวดหมู่ทั้งหมดนั้นเป็นนามธรรมที่ลึกซึ้งแม้ว่ามันจะง่ายที่จะลืมว่าเมื่อคุณมี "Ah ha!" ช่วงเวลา.
jberryman

คำตอบ:


35

คำแนะนำของฉันคือถ้าคุณต้องการเรียนรู้ Scala ให้อ่านหนังสือจาก Paul Chiusano และ Runar Bjarnason:

http://manning.com/bjarnason/

ส่วนที่ II: การออกแบบการใช้งานและไลบรารี combinator

  1. สร้างภาษาเล็ก ๆ น้อย ๆ
  2. อนุกรม JSON
  3. การทดสอบตามข้อกำหนด
  4. พาร์เซอร์
  5. ความขนานที่ใช้งานได้อย่างหมดจด
  6. สถานะการทำงานอย่างหมดจด

ส่วนที่ 3: รูปแบบการออกแบบเพื่อการใช้งาน

  1. กรณีสำหรับนามธรรม
  2. Monoids
  3. Functors
  4. Monads
  5. functors ประยุกต์
  6. โครงสร้างข้อมูลแบบย้อนกลับและพับเก็บได้
  7. Comonads

ส่วนที่ IV: การทำลายกฎ: เอฟเฟกต์และ I / O

  1. ผลกระทบกับผลข้างเคียง
  2. การประมวลผลสตรีมและ I / O ที่เพิ่มขึ้น
  3. บังคับใช้ขอบเขตเอฟเฟกต์กับระบบประเภท

31

ขออภัยฉันไม่ทราบบทความหรือหนังสือที่ครอบคลุมรายละเอียดเกี่ยวกับการใช้งานที่แตกต่างกันสำหรับโครงสร้างเหล่านั้นทั้งหมด แต่ฉันสามารถให้ลิงก์บางส่วนไปยังแหล่งข้อมูลแต่ละรายการได้

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

ในโลกแห่งความเป็นจริง Haskellมีบางบทเกี่ยวกับ monads ในบทที่ 14 Monadsผู้เขียนอธิบายถึงพื้นฐานและการใช้งานทั่วไปบางอย่าง (อาจจะเป็นรายการสถานะ) บทที่ 15 การเขียนโปรแกรมด้วย monadsให้คำอธิบายเพิ่มเติมเกี่ยวกับวิธีการใช้อย่างมีประสิทธิภาพ (ครอบคลุมถึงผู้อ่าน monad ด้วย) บทต่อไปนี้จะอธิบายถึงวิธีการใช้พาร์เซกแต่การค้นหาบทความที่ครอบคลุมวิธีการใช้งานจริงอาจน่าสนใจกว่า: ควรเป็นตัวอย่างที่ดีมากในการใช้ monads ในการแยกวิเคราะห์ Fianlly บทที่ 18 หม้อแปลงโมนาดแนะนำวิธีการทำงานของหม้อแปลง monad จากนั้นแสดงวิธีการสร้างทีละขั้นตอน ข้อพิจารณาในส่วนสุดท้ายของบทก็น่าสนใจเช่นกัน

ผมอ่านครั้งหนึ่งเคยเป็นคำถามที่น่าสนใจจริงๆมากเกี่ยวกับการใช้ความคิดสร้างสรรค์ของ monads ลิงก์ที่เสนอนั้นน่าอ่านเกี่ยวกับหัวข้อนี้ ด้วยจิตวิญญาณนั้นฉันจึงพยายามถามลูกศรแบบเดียวกัน: ฉันได้รับคำตอบน้อยกว่าคำตอบใน monads แต่ก็น่าสนใจอยู่ดี


ด้วยความเคารพต่อรูปแบบ OOP โดยแก๊งสี่มีชุดที่ดีของ 3 บทความโดย IBM เกี่ยวกับหัวข้อในซีรีส์ของพวกเขาความคิดการทำงาน ภาษาที่ใช้งานได้เป้าหมายคือ Scala พวกเขาดำเนินการโดยอธิบายรูปแบบการออกแบบตามปกติใน OOP และแสดงวิธีที่พวกเขาจับคู่กับ Scala

  1. ความคิดการทำงาน: รูปแบบการออกแบบฟังก์ชั่นตอนที่ 1 ที่นี่ครอบคลุมโรงงานวิธีการแม่แบบกลยุทธ์ฟลายเวท บรรทัดล่างคือการมีฟังก์ชันเป็นค่าชั้นหนึ่งทุกอย่างจะง่ายกว่ามาก
  2. ความคิดการทำงาน: รูปแบบการออกแบบฟังก์ชั่น 2 นี้เป็นเรื่องเกี่ยวกับ Java และแรง มันเป็นไปตามรูปแบบอะแดปเตอร์
  3. ความคิดการทำงาน: รูปแบบการออกแบบฟังก์ชั่นส่วนที่ 3 ที่นี่พวกเขาพูดถึงรูปแบบล่าม อีกครั้งภาษาของเป้าหมายนั้นไม่ชัดเจน

บทความที่เกี่ยวข้องมากที่สุดเขียนคำถามของคุณเป็นเรื่องแรก แต่อีกสองเรื่องอาจเป็นเรื่องที่น่าสนใจในการอ่าน


ขอบคุณ แต่ฉันหมายถึงรูปแบบที่แตกต่างกันเช่นรูปแบบ Monad, Arrow, Applicative no GoF
Konstantin Solomatov

@KonstantinSolomatov: ฉันเข้าใจคำถามของคุณผิดขอโทษ ฉันเพิ่มข้อมูลอ้างอิงสำหรับ monads และลูกศร
Riccardo T.

18

Jeremy Gibbons มีรูปแบบในบล็อก FPซึ่งถูกกำหนดให้กลายเป็นหนังสือที่คุณต้องการในที่สุด แน่นอนว่ามันยังไม่อยู่ในสภาพที่จะมีประโยชน์อย่างที่คุณต้องการในตอนนี้ แต่เขาก็สมควรได้รับกำลังใจ!

ในขณะเดียวกันฉันจะพูด +1 สำหรับ Typeclassopedia ของ Brent Yorgey มันมีประโยชน์มากและหากมีบางส่วนที่ทำให้สับสนในภายหลังไซต์นี้เป็นสถานที่ที่ดีในการเข้าถึงด้านล่างของพวกเขา ฉันรู้ว่า Brent เก็บไว้ระหว่างการตรวจสอบ หากเขาไม่สามารถเข้าถึงผู้อ่านของเขาได้โปรดให้ความช่วยเหลือแก่เขา



5

คุณได้อ่านบทต่อ ๆ มาของLearn You a Haskell for Great Goodหรือไม่?

  • บทที่ 6 ครอบคลุมแผนที่และการพับซึ่งเป็นสองใน "รูปแบบการออกแบบ" ที่สำคัญกว่าในภาษาที่ใช้งานได้

  • บทที่ 11-13 ครอบคลุม Functors, Applicative Functors และ Monads ตามลำดับนั้น สิ่งนี้มีประโยชน์ - แบบฝึกหัดจำนวนมากแนะนำ Functors จากนั้น Monads จากนั้นให้ใช้ Applicative Functors ในตอนท้าย (หากครอบคลุมทั้งหมด) ลำดับใน LYAH นั้นดีกว่าเพราะการย้ายจาก Functors => Applicative Functors => Monads จะทำให้คุณค่อยๆก้าวขึ้นสู่ความเป็นทั่วไปและอำนาจ

  • บทที่ 14 ครอบคลุมถึง Zippers - คุณสามารถคิดว่าสิ่งเหล่านี้เป็นคลาสคอนเทนเนอร์ได้อย่างมีประสิทธิภาพโดยมีตัวชี้ไปยังข้อมูลเฉพาะซึ่งหมายความว่าคุณจะได้รับการเข้าถึง O (1) และอัปเดตที่ตำแหน่งตัวชี้

ไม่ครอบคลุมถึง Arrows หรือ Comonads ซึ่งเป็นหัวข้อขั้นสูงใน Haskell เพื่อให้เข้าใจว่าจะใช้ Arrows หรือ Comonads อย่างไรและทำไมคุณควรเข้าใจ Monads อย่างแน่วแน่อยู่แล้วดังนั้นฉันจึงไม่คิดว่านี่เป็นปัญหา - LYAH มุ่งเป้าไปที่จุดเริ่มต้นของตลาด Haskell อย่างมั่นคง


1
ใช่ฉันอ่านหนังสือ ผมชอบมันมาก. น่าเสียดายที่ไม่มีลูกศรแอบแฝงและรูปแบบขั้นสูงอื่น ๆ อีกมากมาย ฉันต้องการอ่านเพิ่มเติมเกี่ยวกับ Monads and Applicatives (ตัวอย่างเช่น LYHGG ไม่ครอบคลุม monad ต่อเนื่อง)
Konstantin Solomatov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.