14
我們如何證明the continuation monad沒有有效的MonadFix
實例?爲什麼MonadFix的實例不能用於連續monad?
我們如何證明the continuation monad沒有有效的MonadFix
實例?爲什麼MonadFix的實例不能用於連續monad?
實際上,這並不是說不能有一個MonadFix
實例,只是庫的類型有點過於拘束。如果你在所有可能的r
小號定義ContT
,則不僅MonadFix
成爲可能,但到Monad
所有實例需要什麼底層函子:
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)
它看起來像你的類型實際上是更受限制的。有沒有真正的情況下強迫參數'ContT'是多態的將阻止有用的實現?如果沒有,這可能只是一個歷史問題-ContT已經存在了很長一段時間,很可能在排名第二的類型之前是Haskell公認的部分。 – dfeuer 2014-09-15 05:14:58
多態參數'ContT'也被稱爲'Codensity'。它缺乏定義'callCC'的能力。 – 2014-09-15 07:59:34
這個答案解釋了爲什麼你的'forall r。 (a - > m r) - > m r''ContT'不能有'callCC'。 http://stackoverflow.com/a/7180154/414413 – Cirdec 2014-09-17 03:04:07