2016-11-21 19 views
5

için "MonadTransControl" örneği yok. Bunu nasıl uygulayacağımı bilmiyorum ve bunu yapmanın bir yolu olmadığını farz ediyorum. Yapılamadığına dair bir kanıt veya ikna edici bir kanıt var mı?Neden "ContT"

ContT ne özel yapar?

+2

Bu yorumları [ContT 'tanımında] göz önünde bulunduruyorum (https://hackage.haskell.org/package/transformers-0.5.2.0/docs/Control-Monad-Trans-Cont.html#t:ContT) ilgili: "' ContT monad kategorisinde bir functor değildir ve pek çok işlem onun üzerinden kaldırılamaz ". Monad (ContT k r m) 'ye sahip olmak için 'Mon' olmanız bile gerekmiyor! – Alec

+0

@Alec Bu kesinlikle tuhaf yapar, ancak 'MonadTransControl' ile bağlamaz –

cevap

2

Genel olarak, ContT r m'dan kurtulmanız gereken tek şey, m r türünde bir değerdir. Run (ContT r) tipi imzası olacaktır

forall n b. ((b -> n r) -> n r) -> n (StT (ContT r) b) 

StT (ContT r) b için tek olası tip r, ancak o zaman bile, geçmek için tip b -> n r arasında olası bir tanımlanmış işlevi yoktur eşdeğerdir

Run (ContT r) = forall n b. Monad n => ContT r n b -> n (StT (ContT r) b) 

ContT. Ve liftWith, Run (ContT r) türünde bir değer gerektiren bir işlev verildiğinden, uygulanamaz. Genel ContT r m a'dan çıkarılan herhangi bir değer, ContT r m a'a geri döndürülemediği için, daha da kötüsü yapar. Yani hem gelen hem de giden kaybedersiniz.

Bu, ContT numarasını MonadFix yapamayacağınız da budur. Rastgele bir a rastgele bir r dönüşemez ve tam tersi.