2016-10-08 17 views
7

Control.Monad.Morph bao gồmTại sao Control.Monad.Morph.hoist lại có ràng buộc Monad?

class MFunctor t where 
    hoist :: Monad m => (forall a. m a -> n a) -> t m b -> t n b 

Theo như tôi có thể nói, không ai trong số các trường hợp bao gồm sử dụng Monad m hạn chế. Làm thế nào có thể làm như vậy? Có trường hợp hợp lệ sử dụng các ràng buộc (đó là một chút khó khăn cho tôi để tưởng tượng như thế nào, cho rằng hoist id = id)? Ý nghĩa của ràng buộc là gì trên m và không phải là n?

+0

Tôi đã mong đợi điều gì đó đột nhập trong ['Control.Monad.Trans.Compose'] (https://hackage.haskell.org/package/mmorph-1.0.6/docs/Control-Monad-Trans-Compose. html), nhưng mọi thứ biên dịch tốt mà không có 'Monad m' trên' hoist' ... – Alec

+0

Có lẽ vì nó chỉ có ý nghĩa đối với monads? Đó là một functor trên một biến áp monad (stack), như xa như tôi có thể nhìn thấy. – Xeo

+0

@Alec 'Control.Monad.Trans.Compose' không có phiên bản' MFunctor'. – Cirdec

Trả lời

6

Control.Monad.Morph là một spinoff từ pipes, vì vậy tôi đoán nó ở đó vì MFunctor dụ cho Proxy cần nó ... Và đủ chắc chắn đó là used there.

instance MFunctor (Proxy a' a b' b) where 
    hoist nat p0 = go (observe p0) 
     where 
     go p = case p of 
      Request a' fa -> Request a' (\a -> go (fa a)) 
      Respond b fb' -> Respond b (\b' -> go (fb' b')) 
      M   m -> M (nat (m >>= \p' -> return (go p'))) 
      Pure r  -> Pure r 

Tôi không nghĩ rằng nó là cần thiết mặc dù. m >>= return . ffmap f m. Nó có lẽ phải là một ràng buộc Functor và mã đó trước khi thực hiện đề xuất đơn lẻ.

+0

Bạn có biết những gì đang làm không? Có phải ràng buộc 'Monad' (hay' Functor') cho ngữ nghĩa, hay chỉ hiệu quả? – dfeuer

+0

Đó là ánh xạ 'hoist nat' đệ quy bên trong' m'. Ràng buộc 'Functor' không phải là một yêu cầu đáng ngạc nhiên đối với bất kỳ biến' t m a' nào của một dạng như 'm (t m a)'. – Cirdec

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