2014-09-13 6 views

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) 
+0

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

+6

Das polymorphe Argument 'ContT' wird auch als'Codesity' bezeichnet. Es fehlt die Fähigkeit, 'callCC' zu definieren. –

+1

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

Verwandte Themen