Могут ли продолжение трансформатора монады быть альтернативным экземпляром с некоторыми и многими?
Мы можем определить продолжение монадного трансформатора как
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
от натурального числа до некоторого другого большего натурального числа.