2014-09-13 14 views

cevap

4

Aslında, kitaplık türü biraz fazla kısıtlanmış olduğu için bir MonadFix örneği olamaz. Eğer mümkün olan tüm r s üzerinde ContT tanımlarsanız MonadFix mümkün hale, ancak en fazla Monad için tüm örnekler altta yatan funktor hiçbir şey gerektirir sadece: senin tipin aslında daha kısıtlı bir tanesidir gibi

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

görünüyor. “ContT” argümanının polimorfik olmaya zorlanmasının yararlı uygulamaları engelleyeceği gerçek durumlar var mı? Eğer değilse, bu muhtemelen sadece bir tarih meselesidir —ContT “uzun bir süredir etraftadır, muhtemelen daha önce 2. tipler Haskell'in kabul gören bir parçasıydı. – dfeuer

+6

Polimorfik argüman 'ContT 'ayrıca' Codensity 'olarak bilinir. CallCC'yi tanımlama yeteneğinden yoksundur. –

+1

Bu cevap, neden 'forall r. (a -> m r) -> m r '' ContT' 'callCC' olamaz. http://stackoverflow.com/a/7180154/414413 – Cirdec

İlgili konular