We can define the continuation monad transformer as
data Cont r m a = Cont {run :: (a -> m r) -> m r}
We can give Cont r m
an Alternative instance if m
is a member of Alternative
via
empty = Cont $ \f -> empty
ca <|> cb = Cont $ \f -> run ca f <|> run cb f
And then allow some
and many
to take on their default methods. My question is, can we define some
and many
in terms of m
's some
and many
, instead of the default definitions? The apparently obvious options
some ca = Cont $ \f -> some $ run ca f
many ca = Cont $ \f -> many $ run ca f
obviously do not work (they do not even type check). Is there some other way to use them (if we need m
to also be a monad, that's fine)?
For reference, some
and many
must be the least solution to the equations:
some v = (:) <$> v <*> many v
many v = some v <|> pure []
Assuming that some :: m a -> m [a]
and many :: m a -> [a]
satisfy this law, so should some :: Cont r m a -> Cont r m [a]
and many :: Cont r m a -> Cont r m [a]
.
No.
There exists no arrow from
that makes use of its argument in an interesting way.
The only place
forall a. f a -> f [a]
can be applied is to anf r
. These are the results of(a -> f r) -> f r
, like in your "obvious options", and([a] -> f r)
. This leaves a result of the typef [r]
. The only thing that can be done with aforall r. Alternative f => f [r]
to produce anf r
is index thef [r]
with some partial functionforall r. [r] -> r
from a natural number to some other no-larger natural number.