mtl, máy biến áp, monads-fd, monadLib và nghịch lý của sự lựa chọn


92

Hackage có một số gói dành cho máy biến áp đơn nguyên:

  • mtl : Thư viện biến áp đơn nguyên
  • máy biến áp : Máy xúc bê tông và máy biến áp đơn nguyên
  • monads-fd : Các lớp đơn nguyên, sử dụng các phụ thuộc hàm
  • monads-tf : Các lớp đơn nguyên, sử dụng các họ kiểu
  • monadLib : Tập hợp các máy biến áp đơn nguyên.
  • mtl-tf : Thư viện biến áp đơn nguyên sử dụng các họ kiểu.
  • mmtl : Thư viện máy biến áp Modular Monad
  • mtlx : Thư viện biến áp đơn nguyên với các chỉ mục loại, cung cấp các bản sao 'miễn phí'.
  • compo-trans : Máy biến áp đơn nguyên dùng một lần

(và có lẽ tôi đã bỏ lỡ một số)

Chúng ta sẽ sử dụng cái nào?

mtl là cái trong Nền tảng Haskell, nhưng tôi vẫn nghe trên reddit rằng nó không đẹp.

Nhưng dù sao thì lựa chọn cũng có gì là xấu, không phải nó chỉ là một điều tốt sao?

Chà, tôi đã thấy ví dụ như tác giả của trình truy cập dữ liệu phải thực hiện tất cả những thứ này như thế nào để chỉ phục vụ cho các lựa chọn phổ biến:

  • Thư viện data-accessor-monadLib: Các chức năng của bộ truy cập cho các monad của monadLib
  • thư viện data-accessor-monads-fd: Sử dụng Accessor để truy cập trạng thái trong lớp monad State monads-fd
  • thư viện data-accessor-monads-tf: Sử dụng Accessor để truy cập trạng thái trong họ loại đơn nguyên Trạng thái monads-tf
  • thư viện data-accessor-mtl: Sử dụng Accessor để truy cập trạng thái trong lớp đơn nguyên mtl State
  • thư viện data-accessor-transformers: Sử dụng Accessor để truy cập trạng thái trong máy biến áp Đơn nguyên trạng thái

Tôi tưởng tượng rằng nếu điều này tiếp tục xảy ra và ví dụ như một số gói Arrow cạnh tranh phát triển, chúng ta có thể thấy một cái gì đó như: muỗngklink-arrows-transformers, muỗngklink-arrows-monadLib, muỗngklink-tfArrows-transformers, muỗngklink-tfArrows-monadLib, ...

Và sau đó tôi lo lắng rằng nếu liên kết muỗng bị chia nhỏ, Hackage sẽ hết dung lượng đĩa. :)

Câu hỏi:

  • Tại sao có nhiều gói máy biến áp đơn nguyên?
  • Tại sao mtl [được coi là] không hoạt động?
  • Sự khác biệt chính là gì?
  • Hầu hết các gói có vẻ cạnh tranh này được viết bởi Andy Gill và được bảo trì bởi Ross Paterson. Điều này có nghĩa là các gói này không cạnh tranh mà hoạt động cùng nhau theo một cách nào đó? Và Andy và Ross có coi bất kỳ gói hàng nào của họ là lỗi thời không?
  • Bạn và tôi nên sử dụng cái nào?

2
Liên kết này đã giúp tôi hiểu mtl vs biến haskell.org/haskellwiki/Monad_Transformer_Library
Brandon Nấu

2
Cuộn xuống để nhận bình luận @jberryman ! Sử dụng mtl hoặc transfomers, chúng trở nên tương thích!
Sophie

Câu trả lời:


70

Một loạt chúng gần như hoàn toàn tương đương:

  • mtlsử dụng phần mở rộng GHC, nhưng transformerslà Haskell 98.
  • monads-fdmonads-tflà các tiện ích bổ sung transformers, sử dụng các phụ thuộc chức năng và họ kiểu tương ứng, cả hai đều cung cấp chức năng trong mtlđó bị thiếu transformers.
  • mtl-tfđược mtlthực hiện lại bằng cách sử dụng các họ kiểu.

Vì vậy, về cơ bản, mtl== transformers++ monads-fd, mtl-tf== transformers++ monads-tf. Tôi nghĩ rằng tính di động và tính mô-đun được cải thiện của transformersvà các gói liên quan của nó là lý do tại sao mtlnhững ngày này không hoạt động.

mmtlmtlxcả hai dường như giống nhau và / hoặc dựa trên mtl, với sự khác biệt về API và các tính năng bổ sung.

MonadLibdường như có một quan điểm khác về các vấn đề, nhưng tôi không trực tiếp làm quen với nó. Cũng có vẻ như sử dụng rất nhiều phần mở rộng GHC, nhiều hơn các phần mở rộng khác.

Thoạt nhìn compose-transcó vẻ giống như công cụ lập trình siêu hình để tạo ra các máy biến áp đơn nguyên. Nó tuyên bố là tương thích với Control.Monad.Trans... Tôi đoán có nghĩa là mtl?

Ở bất kỳ mức độ nào, tôi đề xuất thuật toán quyết định sau:

  • Bạn có cần monads tiêu chuẩn cho một dự án mới không? Sử dụng transformers& co., Giúp chúng tôi nằm mtlnghỉ ngơi.
  • Bạn đã sử dụng mtltrong một dự án lớn chưa? transformerskhông hoàn toàn tương thích, nhưng không ai giết bạn vì không chuyển đổi.
  • Một trong các gói khác có cung cấp chức năng bất thường mà bạn cần không? Cũng có thể sử dụng nó hơn là lăn bánh của riêng bạn.
  • Vẫn chưa hài lòng? Hãy ném tất cả chúng ra, tải xuống category-extrasvà giải quyết tất cả các vấn đề của thế giới với một trang rưỡi mã chung chung vô nghĩa trừu tượng không thể hiểu nổi .

2
nếu mtl == transformers ++ monads-fd, nó không thể được thực hiện theo cách này? (như một giai đoạn hướng tới việc thay thế nó) sẽ không cần phải có những thứ như data-accessor-mtl
yairchu

2
@yairchu: Vâng, nhưng bạn mong đợi tôi làm gì với nó? :) Duy trì khả năng tương thích ngược chưa bao giờ dễ dàng như bạn tưởng và việc thay đổi các thư viện chính cần có thời gian, công sức và sự hỗ trợ của cộng đồng ở một mức độ nào đó. Tình trạng máy biến áp đơn nguyên là một vấn đề đã biết nhưng tôi không nghĩ đó là ưu tiên hàng đầu của bất kỳ ai.
CA McCann

5
@yairchu: về cơ bản đó là những gì đang được thực hiện. phiên bản chính tiếp theo của mtl sẽ là bản sơ khai nhập khẩu biến áp + monads-fd và khả năng tương thích với phiên bản đó sẽ là yếu tố quyết định. Sau đó, các thư viện sẽ có thể được cập nhật riêng lẻ để chúng tương thích với cả mtl 1.1 và 1.2, và sau đó các ứng dụng được tổng hợp vào bất kỳ phiên bản nào được cài đặt hoặc được yêu cầu bởi sự phụ thuộc vào thư viện hạn chế nhất của chúng.
Edward KMETT

2
Danh sách gửi thư của các thư viện hiện đang thảo luận về việc chuyển MonadIO (và có thể là MonadTrans ra khỏi mtl và vào cơ sở. Mặc dù, nó đã bị treo lên về việc có nên trích xuất MonadIO hay MonadBase tổng quát hơn hay không mặc dù thực tế là "MonadBase" cần MPTCs, fundeps, v.v. .
Edward KMETT

27
Kể từ khi tôi tìm thấy bài đăng này rất nhiều thông tin. Tôi nghĩ tôi sẽ cập nhật các googlers khác: mtl bây giờ phụ thuộc vào máy biến áp, monads-fd bây giờ là sơ khai xung quanh mtl. Vì vậy, hãy sử dụng mtl nếu bạn cần những tính năng bổ sung mà nó có, hoặc chỉ nhập máy biến áp nếu nó có mọi thứ bạn cần.
jberryman

20

Cho thời điểm này? Bạn có lẽ nên sử dụng mtl. Điều đang xảy ra là transformersthư viện đang được đưa ra khỏi MTL theo cách monads-fdmonads-tfcó thể cùng tồn tại một cách hòa bình, nhưng cuối cùng thì điều đó vẫn chưa xảy ra.

Khi điều đó xảy ra, bạn sẽ có thể nhập monads-fdtransformersnhận (gần như) cùng một giao diện, ngoại trừ giao diện State, v.v. sẽ là bí danh cho StateT.

Vì vậy, tôi muốn viết thư cho mtl, nhưng không dựa trên thực tế là State, Reader, v.v. hiện đang datađược thay thế bằng types.

MonadLib là một giải pháp thay thế khác mà Iavor đang nghiên cứu, có thể được sử dụng một cách an toàn vì nó không chia sẻ bất kỳ tên mô-đun nào với những người khác, nhưng có cách sử dụng khá khác.


4
Cùng tồn tại theo nghĩa nào? Được sử dụng bởi cùng một gói? Nhập vào cùng một mô-đun? Kết hợp vào cùng một ngăn xếp máy biến áp? Nói chung, việc trộn lẫn quỹ đạo và TF là một ý tưởng tồi. Dù sao, tôi đã không sử dụng rộng rãi transformers& co. nhưng không nhận thấy bất kỳ vấn đề nào ngoài một số khác biệt nhỏ về API so với mtlkhi chuyển đổi một số mã (khá đơn giản).
CA McCann

4
Vấn đề là do bạn chỉ có thể tải một gói cung cấp một mô-đun nhất định. Vì vậy, nếu bạn sử dụng một thư viện sử dụng mtl, ngay cả trong nội bộ, bạn không thể nhập một giải pháp thay thế. Hiện tại, một tỷ lệ hackage lành mạnh sử dụng mtl nội bộ theo một cách nào đó. Một số người thích sử dụng các họ kiểu và monads-tf cung cấp cho họ điều đó, nhưng hãy nhớ rằng tại thời điểm này, cho đến khi quá trình tái cấu trúc biến áp + monads-fd hoàn tất, điều này sẽ khóa mã không sử dụng bất kỳ thư viện nào yêu cầu MTL . Điều đó bao gồm một số hạng mục vé khá lớn.
Edward KMETT

1
Sử dụng máy biến áp + monads- (tf | fd) về lâu dài sẽ tránh được điều đó, nhưng chúng tôi vẫn chưa làm được điều đó. Trong khi đó, ưu thế sử dụng nghiêng về mtl. Lộ trình nâng cấp có vẻ là phiên bản chính tiếp theo của mtl sẽ được định nghĩa lại là bản sơ khai nhập monads-fd và máy biến áp. Dấu ngắt phiên bản chính cung cấp một cách tốt để tuyên bố trong tệp cabal của bạn rằng bạn không quan tâm đến phiên bản nào bạn nhận được (tức là bạn không quan tâm đến việc Trạng thái là một bí danh kiểu hoặc một kiểu dữ liệu) và khi phiên bản chính đó xảy ra thì bạn không cần quan tâm nếu mọi thư viện bạn sử dụng đều có chung thành kiến.
Edward KMETT

1
Vì vậy, cuối cùng kinh nghiệm của bạn cho đến nay chính xác là những gì mà máy biến áp / monads- (tf | fd) được thiết kế để hỗ trợ. Tuy nhiên, những gì được nhận ra sau khi chúng được viết là cộng đồng khá tệ trong việc chuyển đổi thư viện, khi không có lý do thuyết phục để nhảy và vô số lý do kế thừa để ở lại. Do đó cần phải xác định lại mtl và làm rõ ràng lộ trình nâng cấp.
Edward KMETT

Tuyệt vời, cảm ơn vì đã làm rõ chi tiết! Rõ ràng, mã tôi đã chuyển có ít phụ thuộc bên ngoài - tôi nghĩ chủ yếu là các ràng buộc FFI. Tôi cũng không nhận ra rằng xung đột tên mô-đun là ... xâm lấn, tôi đoán vậy? Điều đó thực sự làm cho mọi thứ trở nên khó xử. :(
CA McCann

16

Việc đưa ra các yếu tố mà Edward Kmett đề cập trong câu trả lời của mình đã được hoàn thành vào cuối năm 2010. Kết quả cuối cùng của nó là monads-fd , được xây dựng dựa trên máy biến áp , trở thành phiên bản 2 của mtl . Do sự phổ biến của mtl , monads-tf không bao giờ thực sự bắt kịp. Tính đến đầu năm 2017, mtlmáy biến áp là thư viện máy biến áp đơn nguyên duy nhất được sử dụng rộng rãi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.