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?
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?
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.
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
@Alec Bu kesinlikle tuhaf yapar, ancak 'MonadTransControl' ile bağlamaz –