Мы можем определить продолжение монадного трансформатора как
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]
.