2014-09-13 14 views

Trả lời

4

Thực ra, không phải là không thể có một phiên bản MonadFix, chỉ loại thư viện hơi bị ràng buộc một chút. Nếu bạn xác định ContT khắp nơi có thể r s, sau đó không chỉ MonadFix trở thành có thể, nhưng tất cả các trường lên đến Monad yêu cầu gì về functor cơ bản:

newtype ContT m a = ContT { runContT :: forall r. (a -> m r) -> m r } 
instance Functor (ContT m) where 
    fmap f (ContT k) = ContT (\kb -> k (kb . f)) 
instance Monad (ContT m) where 
    return a = ContT ($a) 
    join (ContT kk) = ContT (\ka -> kk (\(ContT k) -> k ka)) 
instance MonadFix m => MonadFix (ContT m) where 
    mfix f = ContT (\ka -> mfixing (\a -> runContT (f a) ka<&>(,a))) 
    where mfixing f = fst <$> mfix (\ ~(_,a) -> f a) 
+0

Dường như kiểu của bạn thực sự là một trong nhiều hạn chế. Có những tình huống thực sự trong đó việc buộc đối số vào 'ContT' được đa hình sẽ chặn các triển khai hữu ích không? Nếu không, điều này có lẽ chỉ là vấn đề lịch sử — 'ContT' đã tồn tại từ rất lâu, có thể trước khi xếp hạng 2 loại là một phần được chấp nhận tốt của Haskell. – dfeuer

+6

Đối số đa hình 'ContT' còn được gọi là' Mật độ'. Nó thiếu khả năng xác định 'callCC'. –

+1

Câu trả lời này giải thích lý do tại sao 'forall r. (a -> m r) -> m r' 'ContT' không thể có' callCC'. http://stackoverflow.com/a/7180154/414413 – Cirdec

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