Make `MonadCont (ContT r m)` polykinded (r::k), (m::k -> Type)
Issue ==
The current MonadCont (ContT r m)
instance seems to have r::Type
and m::Type -> Type
.
While this is accepted
>>> :t callCC :: ((a -> ContT r m b) -> ContT r m a) -> ContT r m a
callCC :: ((a -> ContT r m b) -> ContT r m a) -> ContT r m a
:: ((a -> ContT r m b) -> ContT r m a) -> ContT r m a
this gets rejected
>>> :set -XPolyKinds
>>> :t callCC :: ((a -> ContT r m b) -> ContT r m a) -> ContT r m a
<interactive>:1:1: error:
• No instance for (MonadCont (ContT r1 m1))
arising from a use of ‘callCC’
• In the expression:
callCC :: ((a -> ContT r m b) -> ContT r m a) -> ContT r m a
and this doesn't reduce
>>> :t callCC @(ContT _ _)
callCC @(ContT _ _)
:: MonadCont (ContT t t1) =>
((a -> ContT t t1 b) -> ContT t t1 a) -> ContT t t1 a
the kinds must be specified
>>> :t callCC @(ContT (_::Type) _)
callCC @(ContT (_::Type) _)
:: ((a -> ContT t t1 b) -> ContT t t1 a) -> ContT t t1 a
Solution
This is unfortunate since since callCC
can be kind polymorphic:
newtype ContT' r m a = ContT' { runContT' :: (a -> m r) -> m r }
callCC' :: forall k a (r :: k) (m :: k -> Type) b.
((a -> ContT' r m b) -> ContT' r m a)
-> ContT' r m a
callCC' f = ContT' $ \ c -> runContT' (f (\ x -> ContT' $ \ _ -> c x)) c
instance forall k (r::k) (m::k -> Type). MonadCont (ContT' r m) where
callCC = callCC'
this works now
>>> :t callCC @(ContT' _ _)
callCC @(ContT' _ _)
:: forall k (t :: k) (t1 :: k -> *) a b.
((a -> ContT' t t1 b) -> ContT' t t1 a) -> ContT' t t1 a
>>> :t callCC :: ((a -> ContT' r m b) -> ContT' r m a) -> ContT' r m a
callCC :: ((a -> ContT' r m b) -> ContT' r m a) -> ContT' r m a
:: forall k a (r :: k) (m :: k -> *) b.
((a -> ContT' r m b) -> ContT' r m a) -> ContT' r m a
Trac metadata
Trac field | Value |
---|---|
Version | 8.0.1 |
Type | FeatureRequest |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Core Libraries |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | ekmett |
Operating system | |
Architecture |