Có thể có cơ chế giống như mtl cho máy biến áp đơn nguyên do FreeT/ProgramT tạo ra không?Các lớp thâm nhập Monad Stack với Transformers Monad miễn phí/hoạt động?
Sự hiểu biết của tôi về lịch sử như sau. Đã có một thời gian biến áp monad được phát minh. Sau đó, mọi người bắt đầu để ngăn chặn máy biến áp monad một ngày khác, sau đó tìm thấy nó gây phiền nhiễu để chèn lift
ở khắp mọi nơi. Sau đó, một vài người đã phát minh ra các lớp monad, để chúng ta có thể ask :: m r
trong bất kỳ đơn vị nào m
sao cho MonadReader r m
. Đây là có thể bằng cách làm cho mọi tầng lớp đơn nguyên thâm nhập mỗi biến đơn nguyên, như
(Monoid w, MonadState s m) => MonadState s (WriterT w m)
MonadWriter w m => MonadWriter w (StateT s m)
bạn cần cặp như thế tờ khai dụ cho mỗi cặp máy biến áp đơn nguyên, vì vậy khi có n đơn nguyên máy biến áp có n^2 chi phí. Tuy nhiên, đây không phải là một vấn đề lớn, bởi vì mọi người chủ yếu sẽ sử dụng các monads được xác định trước và hiếm khi tạo ra các bản nhạc của riêng họ. Câu chuyện cho đến nay tôi hiểu và cũng được nêu chi tiết, ví dụ: trong sau Q & A:
Avoiding lift with Monad Transformers
Sau đó, vấn đề của tôi là với monads miễn phí mới http://hackage.haskell.org/package/free và monads hoạt động http://hackage.haskell.org/package/operational. Chúng cho phép chúng tôi viết DSL của riêng mình và sử dụng nó làm monads, chỉ bằng cách xác định ngôn ngữ như một số loại đại số data
(Hoạt động thậm chí không cần Functor
trường hợp). Tin tốt lành là chúng ta có thể có các máy biến đổi đơn nguyên và monad miễn phí; sau đó làm thế nào về các lớp monad? Tin xấu là giả định "chúng ta hiếm khi xác định biến thế đơn nguyên của chúng ta" không còn giữ.
Như một nỗ lực để hiểu vấn đề này, tôi đã thực hiện hai ProgramT
và khiến chúng thâm nhập lẫn nhau;
https://github.com/nushio3/practice/blob/master/operational/exe-src/test-05.hs
Gói operational
không hỗ trợ lớp đơn nguyên vì vậy tôi đã thực hiện một minioperational
và sửa đổi nó để làm việc như tôi cần; https://github.com/nushio3/minioperational
Tuy nhiên, tôi cần khai báo Ví dụ chuyên
instance (Monad m, Operational ILang m) => Operational ILang (ProgramT SLang m) where
vì tuyên bố chung của các hình thức sau đây dẫn đến trường hợp undecidable.
instance (Monad m, Operational f m) => Operational f (ProgramT g m) where
Câu hỏi của tôi là làm thế nào chúng ta có thể làm cho nó dễ dàng hơn để cho monads hoạt động của chúng tôi thâm nhập lẫn nhau. Hoặc, là mong muốn của tôi để có sự xâm nhập cho bất kỳ đơn vị hoạt động nào bị đặt ra.
Tôi cũng muốn biết các thuật ngữ kỹ thuật chính xác cho thâm nhập :)
Cảm ơn bạn, Petr. Với sự giúp đỡ của bạn, tôi đã hiểu cách kết hợp hai nhà xây dựng kiểu bằng cách sử dụng Hoặc trên '(* -> *)'. https://github.com/nushio3/practice/blob/master/operational/exe-src/test-06.hs Viết thông dịch viên có thể tổng hợp dễ dàng như sau: https://github.com/nushio3/practice/ blob/master/operation/exe-src/test-07.hs Chúng tôi thậm chí có thể soạn nhiều hơn hai ngôn ngữ với chi phí của 'OverlappingInstances'. https://github.com/nushio3/practice/blob/master/operational/exe-src/test-08.hs – nushio