Могут ли продолжение трансформатора монады быть альтернативным экземпляром с некоторыми и многими?

Мы можем определить продолжение монадного трансформатора как

data Cont r m a = Cont {run :: (a -> m r) -> m r}

Мы можем дать Cont r m альтернативный экземпляр, если m является членом Alternative через

empty = Cont $ \f -> empty
ca <|> cb = Cont $ \f -> run ca f <|> run cb f

И затем разрешите some и many использовать свои методы по умолчанию. Мой вопрос: можем ли мы определить some и many в терминах m some и many вместо определения по умолчанию? Очевидно очевидные варианты

some ca = Cont $ \f -> some $ run ca f
many ca = Cont $ \f -> many $ run ca f

очевидно, не работают (они даже не проверяют тип). Есть ли другой способ их использования (если нам нужно m также быть монадой, это прекрасно)?

Для справки, some и many должны иметь наименьшее решение уравнений:

  • some v = (:) <$> v <*> many v
  • many v = some v <|> pure []

Предполагая, что some :: m a -> m [a] и many :: m a -> [a] удовлетворяют этому закону, так что some :: Cont r m a -> Cont r m [a] и many :: Cont r m a -> Cont r m [a].

Ответы

Ответ 1

Нет.

Нет стрелки из

(forall a. f a -> f [a]) ->
(forall r. ((a -> f r) -> f r)) -> (([a] -> f r) -> f r)`

который использует свой аргумент интересным способом.

Единственное место forall a. f a -> f [a] можно применить к f r. Это результаты (a -> f r) -> f r, как в ваших "очевидных вариантах", и ([a] -> f r). Это оставляет результат типа f [r]. Единственное, что можно сделать с помощью forall r. Alternative f => f [r] для создания f r, - это индекс f [r] с некоторой частичной функцией forall r. [r] -> r от натурального числа до некоторого другого большего натурального числа.