2013-06-20 27 views
6

Tại sao không cần sử dụng thang máy để thực hiện một chức năng trong môi trường biến áp đơn lẻ nội bộ, ngoại trừ IO? Ý tôi là, nếu tôi có StateT trên WriterT và WriterT trên ReaderT, tại sao tôi có thể làm điều này?Biến thế Monad và chức năng nâng

tell $ {- any code here for the Writer -} 
foo <- asks {- This for the reader -} 
and so on... 

thay vì

lift $ tell $ {- code ... -} 
... 

Có một lời giải thích đặc biệt hoặc nó chỉ là cách Monad Transformers được viết?

+3

Nhìn vào [tất cả các trường hợp 'WriterT' có] (http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-Writer-Lazy.html#control.i : WriterT). – icktoofay

+1

Lưu ý rằng nếu bạn sử dụng thư viện 'máy biến áp' thay vì' mtl', bạn sẽ phải 'dỡ bỏ' mọi thứ một cách rõ ràng. –

Trả lời

7

Đó là vì Thư viện biến áp Monad (MTL) nhận ra rằng bạn khá phổ biến để ngăn xếp các đơn vị theo cách đó để chúng không xác định tell chỉ là một số chức năng (Mondoid w) => w -> Writer().

Thay vào đó, chúng có MonadWriter được định nghĩa là một kiểu chữ với một hàm trong đó. Sau đó, họ xác định một tấn các phiên bản của MonadWriter: ReaderT, IO, Writer (duh) vv Và do đó bạn tránh sự lặp lại gây phiền nhiễu của lift..

Điều này khá phổ biến, bất kỳ máy biến áp đơn nguyên nào (trong MTL) sẽ có một Control.Monad.***.Class có loại máy đánh chữ này.

+0

Tôi hiểu !, Tôi đã không đọc các trường hợp của Monads. Cảm ơn bạn – Jcao02

Các vấn đề liên quan