Tôi không thể làm gì để mở rộng câu hỏi. Nhưng đây là một trường hợp sử dụng: giả sử bạn có hai máy biến áp đơn nguyên, t
và s
, chuyển so với cùng đơn nguyên m
:Có cách nào để tạo ra hai máy biến áp đơn nguyên nếu chúng thuộc loại khác nhau, nhưng đơn nguyên cơ bản của chúng là cùng loại?
master :: (MonadTrans t, Monad m) => t m a b
slave :: (MonadTrans t, Monad m) => s m a b
Và tôi muốn soạn master
và slave
như vậy mà họ có thể giao tiếp với nhau khi m
nguyên thủy được nâng lên thành t
và s
. Chữ ký có thể là:
bound :: (MonadTrans t, MonadTrans s, Monad m, Monoid a) => t m a b -> s m a b -> (...)
But what is the type of (...) ?
Một trường hợp sử dụng, trong ký hiệu có đường:
master :: Monoid a => a -> t m a b
master a = do
a <- lift . send $ (a,False) -- * here master is passing function param to slave
... -- * do some logic with a
b <- lift . send $ (mempty,True) -- * master terminates slave, and get back result
slave :: Monoid a => (a -> b) -> s m a b
slave g = do
(a,end) <- lift receive
case end of
True -> get >>= \b -> exit b
_ -> (modify (++[g a])) >> slave g
Cập nhật: send
và receive
là nguyên thủy của loại m
.
Tôi xin lỗi nếu ví dụ này có vẻ giả tạo, hoặc giống như coroutines quá nhiều, tinh thần của câu hỏi thực sự không có gì để làm với nó vì vậy xin vui lòng bỏ qua tất cả tương đồng. Nhưng điểm chính là mono t
và s
không thể được hợp lý sáng tác với nhau trước đây, nhưng sau khi cả hai bọc một số đơn nguyên cơ bản m
, bây giờ chúng có thể được sáng tác và chạy như một hàm duy nhất. Đối với các loại chức năng sáng tác, tôi thực sự không chắc chắn vì vậy một số hướng được đánh giá cao. Bây giờ nếu trừu tượng này đã tồn tại và tôi chỉ không biết về nó, thì điều đó sẽ là tốt nhất.
Là 's' và' t' tùy ý hoặc chúng bằng cách nào đó cụ thể - chúng ta đang cố gắng tạo ra 's' và' t'? Và câu hỏi tương tự cũng áp dụng cho 'm' - làm thế nào về nó và' send' và 'receive' của nó? –
Có 's' và' t' là tùy ý. 'm' là kiểu cụ thể mà chúng ta đang cố tạo ở đây. 'send' và' receive' chỉ là các hàm nguyên thủy của kiểu '(a, Bool) -> m a b' và' m a b' tương ứng. Nhưng chúng là ngẫu nhiên đối với trường hợp sử dụng giả tạo mà tôi đưa ra, các chi tiết về việc triển khai chúng không quan trọng. – chibro2