mtl, หม้อแปลง, monads-fd, monadLib และความขัดแย้งของทางเลือก


91

Hackage มีหลายแพ็คเกจสำหรับ monad transformers:

  • mtl : ห้องสมุดหม้อแปลง Monad
  • หม้อแปลง : คอนกรีต functor และ monad transformers
  • monads-fd : คลาส Monad โดยใช้การพึ่งพาการทำงาน
  • monads-tf : คลาส Monad โดยใช้ประเภทครอบครัว
  • monadLib : ชุดของหม้อแปลง monad
  • mtl-tf : ไลบรารีหม้อแปลง Monad โดยใช้ตระกูลประเภท
  • mmtl : ไลบรารีหม้อแปลง Modular Monad
  • mtlx : ไลบรารีหม้อแปลง Monad พร้อมดัชนีประเภทให้สำเนา 'ฟรี'
  • compose-trans : หม้อแปลง monad ที่ประกอบได้

(และบางทีฉันก็พลาดไปบ้าง)

เราจะใช้อันไหนดี?

mtl เป็นหนึ่งในแพลตฟอร์ม Haskell แต่ฉันเคยได้ยินเกี่ยวกับ reddit ว่ามัน uncool

แต่สิ่งที่ไม่ดีเกี่ยวกับการเลือกมันไม่ใช่แค่สิ่งที่ดีเหรอ

ฉันได้เห็นตัวอย่างเช่นผู้เขียนผู้เข้าถึงข้อมูลต้องทำสิ่งเหล่านี้เพื่อตอบสนองตัวเลือกยอดนิยม:

  • data-accessor-monadLib library: ฟังก์ชัน Accessor สำหรับ monads ของ monadLib
  • data-accessor-monads-fd library: ใช้ Accessor เพื่อเข้าถึงสถานะในคลาส monad ของ monads-fd State
  • ไลบรารี data-accessor-monads-tf: ใช้ Accessor เพื่อเข้าถึงสถานะในตระกูล monad type monads-tf State
  • data-accessor-mtl library: ใช้ Accessor เพื่อเข้าถึง state ใน mtl State monad class
  • ไลบรารี data-accessor-transformers: ใช้ Accessor เพื่อเข้าถึงสถานะใน transformers State monad

ฉันจินตนาการว่าถ้าสิ่งนี้เกิดขึ้นและตัวอย่างเช่นแพ็คเกจ Arrow ที่แข่งขันกันพัฒนาขึ้นเราอาจเห็นบางอย่างเช่น: spoonklink-arrows-transformers, spoonklink-arrows-monadLib, spoonklink-tfArrows-transformers, spoonklink-tfArrows-monadLib, ...

จากนั้นฉันก็กังวลว่าหาก Spoonklink ถูกส้อมการแฮ็กจะทำให้พื้นที่ดิสก์หมด :)

คำถาม:

  • เหตุใดจึงมีแพ็คเกจหม้อแปลง Monad มากมาย?
  • เหตุใด mtl จึง [ถือว่า] uncool?
  • อะไรคือความแตกต่างที่สำคัญ?
  • แพ็คเกจที่ดูเหมือนจะแข่งขันกันเหล่านี้ส่วนใหญ่เขียนโดย Andy Gill และดูแลโดย Ross Paterson หมายความว่าแพ็กเกจเหล่านี้ไม่ได้แข่งขันกัน แต่ทำงานร่วมกันไม่ทางใดก็ทางหนึ่ง? Andy และ Ross คิดว่าแพ็คเกจของตัวเองล้าสมัยหรือไม่?
  • คุณและฉันควรใช้อันไหน?

2
ลิงค์นี้ช่วยให้ฉันเข้าใจmtl
Brandon Cook

2
เลื่อนลงเพื่อแสดงความคิดเห็น @jberryman ! ใช้ mtl หรือทรานฟอเมอร์ก็เข้ากันได้!
Sophie

คำตอบ:


70

กลุ่มของพวกเขาเกือบจะเทียบเท่ากันทั้งหมด:

  • mtlใช้นามสกุล GHC แต่transformersเป็น Haskell 98
  • monads-fdและmonads-tfมี add-on เพื่อtransformersใช้อ้างอิงในการทำงานและประเภทครอบครัวตามลำดับทั้งสองให้การทำงานในที่ขาดหายไปจากmtltransformers
  • mtl-tfถูกนำมาmtlใช้ใหม่โดยใช้ตระกูลประเภท

ดังนั้นหลักmtl== transformers++ monads-fd, mtl-tf== ++transformers monads-tfความสามารถในการพกพาที่ดีขึ้นและความเป็นโมดูลาร์transformersและแพ็คเกจที่เกี่ยวข้องทำให้mtlทุกวันนี้ฉันคิดว่า uncool

mmtlและmtlxทั้งสองดูเหมือนจะคล้ายและ / หรือขึ้นอยู่mtlกับความแตกต่างของ API และคุณสมบัติพิเศษ

MonadLibดูเหมือนจะค่อนข้างแตกต่างกันในเรื่องต่างๆ แต่ฉันไม่คุ้นเคยกับเรื่องนี้โดยตรง ดูเหมือนว่าจะใช้ส่วนขยาย GHC มากกว่าส่วนขยายอื่น ๆ

ในภาพรวมcompose-transดูเหมือนว่าจะเป็นเหมือนโปรแกรม metaprogramming สำหรับการสร้าง monad transformers มันอ้างว่าเข้ากันได้กับControl.Monad.Transซึ่ง ... ฉันเดาว่าหมายถึงmtl?

ไม่ว่าในกรณีใดฉันขอแนะนำให้ใช้อัลกอริทึมการตัดสินใจต่อไปนี้:

  • คุณต้องการ monads มาตรฐานสำหรับโครงการใหม่หรือไม่? ใช้transformers& co. ช่วยให้เราmtlพักผ่อน
  • คุณใช้งานmtlในโครงการขนาดใหญ่อยู่แล้วหรือไม่? transformersเข้ากันไม่ได้อย่างสมบูรณ์ แต่จะไม่มีใครฆ่าคุณเพราะไม่เปลี่ยน
  • หนึ่งในแพ็คเกจอื่น ๆ มีฟังก์ชันการทำงานที่ผิดปกติที่คุณต้องการหรือไม่? เช่นกันอาจใช้แทนการหมุนของคุณเอง
  • ยังไม่พอใจ? ทิ้งพวกเขาทั้งหมดดาวน์โหลดcategory-extrasและแก้ไขปัญหาทั้งหมดของโลกด้วยหน้าและครึ่งหนึ่งของรหัสทั่วไปที่ไม่สามารถเข้าใจได้ในเชิงนามธรรมที่น่าทึ่ง

2
ถ้า mtl == transformers ++ monads-fd ไม่สามารถใช้งานด้วยวิธีนี้ได้หรือไม่? (เป็นขั้นตอนในการแทนที่) ที่จะกำจัดความจำเป็นในการมีสิ่งต่างๆเช่น data-accessor-
mtl

2
@yairchu: ใช่ แต่คุณคาดหวังให้ฉันทำอะไรกับมัน? :) การรักษาความเข้ากันได้แบบย้อนกลับไม่เคยง่ายอย่างที่คิดและการเปลี่ยนไลบรารีหลักต้องใช้เวลาความพยายามและการสนับสนุนจากชุมชนในระดับหนึ่ง สถานการณ์หม้อแปลง monad เป็นปัญหาที่ทราบกันดี แต่ฉันไม่คิดว่ามันสำคัญที่สุดของใครด้วยการยิงไกล
CA McCann

5
@yairchu: นั่นคือสิ่งที่กำลังทำอยู่ mtl เวอร์ชันหลักถัดไปควรเป็นส่วนที่นำเข้าหม้อแปลง + monads-fd และความเข้ากันได้กับเวอร์ชันนั้นจะเป็นปัจจัยในการตัดสินใจ จากนั้นไลบรารีจะสามารถอัปเดตทีละรายการเพื่อให้เข้ากันได้กับทั้ง mtl 1.1 และ 1.2 จากนั้นแอพจะถูกแบ่งออกเป็นเวอร์ชันใดก็ตามที่ติดตั้งหรือจำเป็นโดยการพึ่งพาไลบรารีที่ จำกัด ที่สุด
Edward KMETT

2
ขณะนี้รายชื่ออีเมลของไลบรารีกำลังหารือเกี่ยวกับการย้าย MonadIO (และอาจเป็น MonadTrans ออกจาก mtl และเข้าสู่ฐานแม้ว่าจะมีการวางสายว่าจะแยก MonadIO หรือ MonadBase ทั่วไปมากกว่าแม้ว่า "MonadBase" จะต้องการ MPTCs, fundeps ฯลฯ .
Edward KMETT

28
เนื่องจากฉันพบว่าโพสต์นี้ให้ข้อมูลอย่างมาก ฉันคิดว่าฉันจะอัปเดต googler อื่น ๆ : ตอนนี้ mtl ขึ้นอยู่กับหม้อแปลงแล้วตอนนี้ monads-fd กลายเป็นสตับรอบ mtl ดังนั้นใช้ mtl หากคุณต้องการสินค้าพิเศษที่มีหรือเพียงแค่นำเข้าหม้อแปลงหากมีทุกสิ่งที่คุณต้องการ
jberryman

19

สำหรับช่วงเวลาที่? คุณน่าจะใช้mtl. สิ่งที่เกิดขึ้นคือtransformersห้องสมุดกำลังถูกแยกออกจาก MTL ในรูปแบบที่monads-fdและmonads-tfสามารถอยู่ร่วมกันได้อย่างสงบสุข แต่ในการตรวจสอบครั้งสุดท้ายยังไม่เป็นเช่นนั้น

ที่เกิดขึ้นเมื่อคุณจะสามารถที่จะนำเข้าmonads-fdและtransformersและได้รับ (เกือบ) อินเตอร์เฟซเดียวกันกับข้อยกเว้นที่Stateฯลฯ StateTจะเป็นนามแฝงสำหรับ

ดังนั้นฉันจะเขียนถึงmtlแต่ไม่ได้ขึ้นอยู่กับข้อเท็จจริงที่ว่า State, Reader ฯลฯ อยู่ในขณะนี้dataเนื่องจากจะถูกแทนที่ด้วยtypes

MonadLib เป็นอีกทางเลือกหนึ่งที่ Iavor กำลังดำเนินการอยู่ซึ่งสามารถใช้ได้อย่างปลอดภัยเนื่องจากไม่แชร์ชื่อโมดูลใด ๆ กับผู้อื่น แต่มีรูปแบบการใช้งานที่แตกต่างกันพอสมควร


4
อยู่ร่วมกันในแง่ใด? ใช้โดยแพ็คเกจเดียวกันหรือไม่? นำเข้าสู่โมดูลเดียวกันหรือไม่ รวมเป็นกองหม้อแปลงเดียวกัน? การผสม fundeps และ TF ทำให้ฉันเป็นความคิดที่ไม่ดีโดยทั่วไป อย่างไรก็ตามฉันไม่ได้ใช้transformers& co อย่างกว้างขวาง แต่ไม่สังเกตเห็นปัญหาใด ๆ นอกเหนือจากความแตกต่างเล็กน้อยของ API กับmtlเมื่อเปลี่ยนรหัส (ค่อนข้างง่าย)
CA McCann

4
ปัญหามาจากข้อเท็จจริงที่ว่าคุณสามารถโหลดได้เพียงหนึ่งแพ็คเกจที่มีโมดูลที่กำหนด ดังนั้นหากคุณใช้ไลบรารีที่ใช้ mtl แม้กระทั่งภายในคุณจะไม่สามารถนำเข้าทางเลือกอื่นได้ ขณะนี้เปอร์เซ็นต์ของการแฮ็กที่ดีใช้ mtl ภายในไม่ทางใดก็ทางหนึ่ง ผู้คนจำนวนมากชอบใช้ตระกูลประเภทและ monads-tf ให้พวกเขา แต่โปรดจำไว้ว่าในขณะนี้จนกว่าการปรับโครงสร้าง Transformers + monads-fd จะเสร็จสมบูรณ์สิ่งนี้จะล็อครหัสไม่ให้ใช้ไลบรารีใด ๆ ที่ต้องใช้ MTL . ซึ่งรวมถึงรายการตั๋วขนาดใหญ่บางรายการ
Edward KMETT

1
การใช้ Transformers + monads- (tf | fd) ในระยะยาวจะหลีกเลี่ยงของดองนั้นได้ แต่เรายังไม่มี ในขณะเดียวกันความเหนือกว่าของการใช้งานอยู่ในความโปรดปรานของ mtl เส้นทางการอัปเกรดดูเหมือนว่า mtl เวอร์ชันหลักถัดไปจะถูกกำหนดใหม่เป็นสตับที่นำเข้า monads-fd และ transformers การแบ่งเวอร์ชันหลักเป็นวิธีที่ดีในการระบุในไฟล์ cabal ของคุณโดยที่คุณไม่สนใจว่าเวอร์ชันใดที่คุณได้รับ (เช่นคุณไม่สนใจว่าสถานะจะเป็นนามแฝงประเภทหรือประเภทข้อมูล) และเมื่อการชนเวอร์ชันหลักนั้นเกิดขึ้น คุณไม่จำเป็นต้องสนใจว่าทุกห้องสมุดที่คุณใช้ทั้งหมดมีอคติเดียวกันหรือไม่
Edward KMETT

1
ดังนั้นในที่สุดประสบการณ์ของคุณจนถึงตอนนี้ก็คือสิ่งที่ Transformers / monads- (tf | fd) ได้รับการออกแบบมาเพื่อรองรับ แต่สิ่งที่ได้รับรู้หลังจากที่พวกเขาเขียนก็คือชุมชนค่อนข้างแย่ในการเปลี่ยนไลบรารีเมื่อไม่มีเหตุผลที่น่าสนใจที่จะกระโดดและเหตุผลดั้งเดิมมากมายที่จะอยู่ต่อไป ดังนั้นจึงจำเป็นต้องกำหนด mtl ใหม่และทำให้เส้นทางการอัพเกรดชัดเจน
Edward KMETT

เยี่ยมมากขอบคุณสำหรับคำชี้แจงโดยละเอียด! เห็นได้ชัดว่ารหัสที่ฉันเปลี่ยนมีการอ้างอิงภายนอกเพียงเล็กน้อย - ส่วนใหญ่ฉันคิดว่าการผูก FFI ฉันยังไม่ทราบว่าความขัดแย้งของชื่อโมดูลคือ ... รุกรานฉันเดา? นั่นทำให้สิ่งต่าง ๆ อึดอัดแน่นอน :(
CA McCann

16

แฟออกเอ็ดเวิร์ด Kmett กล่าวถึงในคำตอบของเขาเสร็จสมบูรณ์ในช่วงปลายปี 2010 สิ้นผลของมันmonads-FD , สร้างขึ้นบนหม้อแปลงกลายเป็นรุ่นที่ 2 ของMTL อันเป็นผลมาจากความแพร่หลายของmtlทำให้monads-tfไม่เคยติดมาก่อน ในช่วงต้นปี 2560 mtlและหม้อแปลงเป็นไลบรารี monad transformer เพียงแห่งเดียวที่มีการใช้งานอย่างแพร่หลาย

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