14
the continuation monad'un geçerli bir MonadFix
örneği olmadığını nasıl ispatlayabiliriz?Niçin devam eden monad için bir MonadFix örneği olamaz?
the continuation monad'un geçerli bir MonadFix
örneği olmadığını nasıl ispatlayabiliriz?Niçin devam eden monad için bir MonadFix örneği olamaz?
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)
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
Polimorfik argüman 'ContT 'ayrıca' Codensity 'olarak bilinir. CallCC'yi tanımlama yeteneğinden yoksundur. –
Bu cevap, neden 'forall r. (a -> m r) -> m r '' ContT' 'callCC' olamaz. http://stackoverflow.com/a/7180154/414413 – Cirdec