Możemy zdefiniować transformator kontynuacja monady jakoCzy transformator monad kontynuacji może mieć alternatywną instancję z niektórymi i wieloma?
data Cont r m a = Cont {run :: (a -> m r) -> m r}
Możemy dać Cont r m
Alternatywnych instancji jeśli m
jest członkiem Alternative
poprzez
empty = Cont $ \f -> empty
ca <|> cb = Cont $ \f -> run ca f <|> run cb f
a następnie pozostawić some
i many
podjąć na ich domyślne metody. Moje pytanie brzmi: czy możemy zdefiniować wartości some
i many
w kategoriach m
'some
i many
zamiast domyślnych definicji? Pozornie oczywiste opcje mogą oczywiście nie działać (nawet nie sprawdzają). Czy jest jakiś inny sposób ich użycia (jeśli potrzebujemy, aby m
była monadą, to w porządku)?
Dla porównania, some
i many
muszą najmniej rozwiązanie równań:
some v = (:) <$> v <*> many v
many v = some v <|> pure []
Zakładając, że some :: m a -> m [a]
i many :: m a -> [a]
spełnienia tego prawo, więc powinien some :: Cont r m a -> Cont r m [a]
i many :: Cont r m a -> Cont r m [a]
.
Jeśli jednak 'r' ma jakąś dodatkową strukturę, być może coś da się zrobić. Na przykład, być może moglibyśmy "fmap fold" z 'f [r]' oraz z odpowiednimi prawami spójności, które mogłyby być równoważne. – luqui
Chciałbym się różnić. 'some ca = Cont $ \ fla -> uruchom ca $ \ a -> (trochę $ czystego a) >> = fla' jest trochę interesujące. Pytanie brzmi, czy jest to poprawna instancja 'some'. – PyRulez
Nie można uzyskać '[a]' z 'f [a]' jak 'some $ pure a' z tylko ograniczeniem' Alternative f'. Aby coś z nim zrobić, potrzebujesz 'Monad f' lub' Traversable f'. – Cirdec