15

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].

Odpowiedz

4

nr

Nie istnieje strzałkę z

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

sprawia, że ​​korzystanie z jego argumentów w ciekawy sposób.

Jedynym miejscem, w którym można zastosować forall a. f a -> f [a], jest f r. Są to wyniki (a -> f r) -> f r, podobnie jak w "oczywistych opcjach" i ([a] -> f r). Pozostawia to wynik typu f [r]. Jedyne, co można zrobić z forall r. Alternative f => f [r], aby wytworzyć f r, jest indeks f [r] z pewną funkcją częściową forall r. [r] -> r od liczby naturalnej do pewnej innej nie większej większej liczby naturalnej.

+0

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

+0

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

+0

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