14
Làm cách nào chúng tôi có thể chứng minh rằng the continuation monad không có phiên bản hợp lệ của MonadFix
?Tại sao không thể có một trường hợp của MonadFix cho đơn nguyên tiếp tục?
Làm cách nào chúng tôi có thể chứng minh rằng the continuation monad không có phiên bản hợp lệ của MonadFix
?Tại sao không thể có một trường hợp của MonadFix cho đơn nguyên tiếp tục?
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)
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
Đối số đa hình 'ContT' còn được gọi là' Mật độ'. Nó thiếu khả năng xác định 'callCC'. –
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