a

Câu hỏi MonadBaseControl dùng để làm gì?


Tôi đang đào sâu hơn vào các mono của Yesod và đã gặp phải MonadBaseControl. Tôi đã nhìn vào tài liệu hack, và đã bị mất. Ai đó có thể cho tôi biết vấn đề nó đang cố gắng giải quyết?


22
2017-07-27 19:17


gốc


Nó thực sự từ điều khiển đơn nguyên, mô tả gói có "Gói này xác định loại lớp MonadBaseControl, một tập hợp con của MonadBase thành các hoạt động kiểm soát chung như bắt có thể được nâng lên từ IO hoặc bất kỳ đơn vị cơ sở nào khác." Không cho tôi biết vấn đề nào có nghĩa là để giải quyết, thật không may. - Daniel Fischer
Hãy xem [dỡ bỏ cơ sở] (hackage.haskell.org/package/lifted-base). Nó cung cấp các phiên bản nâng cấp của nhiều tiêu chuẩn IOchức năng dựa trên. Ví dụ: sử dụng MonadBaseControl bạn có thể viết một đoạn mã chạy bên trong một tổ hợp IOngăn xếp đơn nguyên, và gọi fork bên trong ngăn xếp đó, chuyển bất kỳ ngữ cảnh nào mà đơn nguyên cũng đã vào trong nhánh được chia đôi. - Petr Pudlák


Các câu trả lời:


Nó đến từ gói điều khiển đơn nguyênvà là một trong một cặp lớp học (một lớp khác MonadTransControl) tăng cường MonadBase (resp. MonadTrans) bằng cách hỗ trợ một giải pháp thay thế liftBase (resp. lift) hoạt động cho các monads thực hiện nó. Phiên bản nâng cao này không còn thực hiện một hành động đơn giản trong đơn nguyên cơ sở tuyệt đối (đơn vị cơ sở ngay lập tức), nhưng thay vào đó có một hàm lấy trạng thái nguyên bản của toàn bộ đơn vị (đơn vị chuyển đổi đơn nguyên) tại thời điểm đó làm tham số duy nhất của nó và trả về hành động nói trên.

Khi trạng thái tài liệu gói, tính năng nâng cao này, cùng với phần còn lại của nội dung của các lớp loại này, cho phép bạn nâng các chức năng như catch, allocaforkIO từ đơn nguyên cơ bản tuyệt đối (đơn vị cơ bản ngay lập tức), điều này không thể thực hiện được với sơ đồ đơn giản hơn trong MonadBase (resp. MonadTrans) bởi vì cặp sau không cho phép bạn nhấc lập luận của một hàm, chỉ là các kết quả, trong khi cách tiếp cận được thực hiện bởi điều khiển đơn nguyên cho phép cả hai.

Kết quả là, tập hợp các monads (resp. Monad transformers) có thể được sử dụng với MonadBaseControl (resp. MonadTransControl) là một tập hợp con nghiêm ngặt của tập hợp các đơn vị có thể được sử dụng với MonadBase (resp. MonadTrans), nhưng các nhóm cũ mạnh hơn nhiều so với nhóm thứ hai vì cùng lý do.


16
2017-07-28 03:19





Michael Snoyman thực sự đã viết một bài hướng dẫn nhỏ về kiểm soát đơn điệu: http://www.yesodweb.com/book/monad-control

Ý chính của bài viết đó có thể là như sau:

Hãy tưởng tượng bạn có đoạn mã này:

withMyFile :: (Handle -> IO a) -> IO a
withMyFile = withFile "test.txt" WriteMode

Bạn có thể áp dụng withMyFile cho bất kỳ chức năng nào của loại Handle -> IO a và có được một tốt đẹp IO a giá trị. Tuy nhiên, nếu bạn có một chức năng của loại Handle -> ErrorT MyError IO a và muốn có giá trị loại ErrorT MyError IO a? Về cơ bản, bạn sẽ phải sửa đổi withMyFile để kết hợp nhiều gói / unwrapping. MonadBaseControl cho phép bạn 'nâng' các chức năng như withMyFile đến một số bộ chuyển đổi đơn nhất cho phép mở rộng ("chạy"). Do đó, mã kết quả trông giống như sau:

useMyFileError :: (Handle -> ErrorT MyError IO ()) -> ErrorT MyError IO ()
useMyFileError func = control $ \run -> withMyFile $ run . func

17
2017-08-11 07:18