map
มีไว้เพื่อลดความซับซ้อนของการดำเนินการในรายการและด้วยเหตุผลทางประวัติศาสตร์ (ดูจุดของแผนที่ใน Haskell คืออะไรเมื่อมี fmap? )
คุณอาจถามว่าทำไมเราต้องมีฟังก์ชันแผนที่แยกต่างหาก ทำไมไม่ใช้ฟังก์ชั่นแผนที่เฉพาะรายการปัจจุบันแล้วเปลี่ยนชื่อ fmap เป็นแผนที่แทนล่ะ? นั่นเป็นคำถามที่ดี ข้อโต้แย้งตามปกติคือคนที่เพิ่งเรียนรู้ Haskell เมื่อใช้แผนที่ไม่ถูกต้องมักจะเห็นข้อผิดพลาดเกี่ยวกับรายการมากกว่า Functors
- Typeclassopedia , หน้า 20
fmap
และliftM
มีอยู่เนื่องจาก monads ไม่ได้เป็นคนตลกโดยอัตโนมัติใน Haskell:
ความจริงที่ว่าเรามีทั้ง fmap และ liftM เป็นผลมาจากความโชคร้ายที่คลาสประเภท Monad ไม่ต้องการอินสแตนซ์ Functor แม้ว่าจะพูดในเชิงคณิตศาสตร์ แต่ monad ทุกตัวก็เป็น functor อย่างไรก็ตาม fmap และ liftM นั้นใช้แทนกันได้เนื่องจากเป็นข้อบกพร่อง (ในทางสังคมมากกว่าความรู้สึกทางเทคนิค) สำหรับประเภทใด ๆ ที่จะเป็นอินสแตนซ์ของ Monad โดยไม่ต้องเป็นอินสแตนซ์ของ Functor
- Typeclassopedia , หน้า 33
แก้ไข: ประวัติของ agustuss map
และfmap
:
นั่นไม่ใช่สิ่งที่เกิดขึ้นจริง สิ่งที่เกิดขึ้นคือประเภทของแผนที่ถูกกำหนดให้ครอบคลุม Functor ใน Haskell 1.3 กล่าวคือใน Haskell 1.3 fmap ถูกเรียกว่า map จากนั้นการเปลี่ยนแปลงนี้ถูกเปลี่ยนกลับใน Haskell 1.4 และมีการนำ fmap มาใช้ เหตุผลของการเปลี่ยนแปลงนี้คือการสอน เมื่อสอน Haskell ให้กับผู้เริ่มต้นประเภทของแผนที่ทั่วไปทำให้ข้อความแสดงข้อผิดพลาดเข้าใจยากขึ้น ในความคิดของฉันนี่ไม่ใช่วิธีที่ถูกต้องในการแก้ปัญหา
- จุดของแผนที่ใน Haskell คืออะไรเมื่อมี fmap?