Wie können wir beweisen, dass the continuation monad keine gültige Instanz von MonadFix
hat?Warum kann es keine Instanz von MonadFix für die Continuation Monade geben?
14
A
Antwort
4
Nun, eigentlich ist es nicht so, dass es keine MonadFix
Instanz geben kann, nur dass der Typ der Bibliothek etwas zu eingeschränkt ist. Wenn Sie ContT
über alle möglichen r
s definieren, dann nicht nur geworden MonadFix
möglich, aber alle Instanzen bis zu Monad
verlangen nichts von dem zugrunde liegenden Funktors:
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)
Es sieht aus wie Ihre Art eigentlich die eingeschränkteren ist. Gibt es reale Situationen, in denen das Argument, "ContT" zu polymorph zu machen, nützliche Implementierungen blockieren würde? Wenn nicht, ist das wahrscheinlich nur eine Frage der Geschichte - "ConTT" gibt es schon lange, wahrscheinlich bevor Rang 2-Typen ein gut akzeptierter Teil von Haskell waren. – dfeuer
Das polymorphe Argument 'ContT' wird auch als'Codesity' bezeichnet. Es fehlt die Fähigkeit, 'callCC' zu definieren. –
Diese Antwort erklärt warum Ihr 'forall r. (a -> m r) -> m r '' ContT' kann nicht 'callCC' haben. http://StackOverflow.com/a/7180154/414413 – Cirdec