Wir können die Fortsetzung Monade Transformator alsKann der Continuation Monad Transformer eine Alternative Instanz mit einigen und vielen geben?
data Cont r m a = Cont {run :: (a -> m r) -> m r}
definieren wir Cont r m
eine Alternative Instanz geben kann, wenn m
Mitglied Alternative
über
empty = Cont $ \f -> empty
ca <|> cb = Cont $ \f -> run ca f <|> run cb f
und dann some
und many
ermöglichen, sich auf ihre Standard zu nehmen Methoden. Meine Frage ist, können wir some
und many
in Bezug auf m
's some
und many
definieren, anstatt der Standarddefinitionen? Die scheinbar offensichtlichen Optionen
some ca = Cont $ \f -> some $ run ca f
many ca = Cont $ \f -> many $ run ca f
offensichtlich nicht funktionieren (sie Scheck nicht einmal eingeben). Gibt es eine andere Möglichkeit, sie zu benutzen (wenn wir m
brauchen, um auch eine Monade zu sein, ist das in Ordnung)?
Als Referenz some
und many
muss die kleinste Lösung der Gleichungen:
some v = (:) <$> v <*> many v
many v = some v <|> pure []
Unter der Annahme, dass some :: m a -> m [a]
und many :: m a -> [a]
dieses Gesetz genügen, so sollte some :: Cont r m a -> Cont r m [a]
und many :: Cont r m a -> Cont r m [a]
.
Wenn 'r' etwas zusätzliche Struktur hatte, könnte vielleicht etwas getan werden. Zum Beispiel könnten wir das 'f [r]' 'fmap falten 'und mit geeigneten Kohärenzgesetzen, die äquivalent sein könnten. – luqui
Ich würde mich zu unterscheiden. 'einige ca = Cont $ \ Fla -> ca $ \ a -> (etwas $ pure a) >> = fla 'ist eine Art interessant. Die Frage ist, ob dies eine gültige "einige" Instanz ist. – PyRulez
Sie können das '[a]' nicht aus einem 'f [a]' wie 'einige $ pure a' mit nur einer' Alternative f' Bedingung erhalten. Sie brauchen entweder "Monad f" oder "Traversable f", um etwas damit zu tun. – Cirdec