Nhìn vào StateT
có thể là bài học:
newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }
Ở đây nhà nước không phải là "nội" hay "bên ngoài", nhưng kiểu của nó là xen kẽ với các đơn nguyên nó đang thay đổi, một số bit bên trong, một số bên ngoài. Và thực sự là
newtype ReaderT r m a = ReaderT { runReaderT :: r -> m a }
là tất cả "bên ngoài". Vì vậy, nó phụ thuộc vào những gì biến nó được. Có lẽ một số lý thuyết thể loại mà ít nhất một phần giải thích xen kẽ này, tôi tò mò muốn biết về nó (trí thức?).
Contrast với functors applicative, mà
newtype Compose f g a = Compose { getCompose :: f (g a) }
là một applicative là tốt, vì vậy luôn luôn có một rõ ràng "bên trong/bên ngoài" mối quan hệ. Bạn có thể thực hiện một applicative chỉ StateT
, và tìm ra cấu trúc của nó bởi Compose (State s)
:
ApplicativeStateT s f a = s -> (s, f a)
Trong thực tế, có một số khác nếu bạn soạn ở bên phải:
ApplicativeStateT' s f a = f (s -> (s,a))
Nhưng monads không có đều đặn như vậy.
Bởi vì chúng tôi chuyển đổi đơn nguyên 'Có thể', chứ không phải cái' Có thể' chứa? –
Tôi nghĩ rằng điều này đã được trả lời ở đâu đó trước đây, nhưng tôi không thể tìm thấy nó. – leftaroundabout