15

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

Antwort

4

Nr

Es gibt keinen Pfeil von

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

die Verwendung des Arguments auf eine interessante Weise macht.

Der einzige Platz forall a. f a -> f [a] kann auf eine f r angewendet werden. Dies sind die Ergebnisse von (a -> f r) -> f r, wie in Ihren "offensichtlichen Optionen" und ([a] -> f r). Dies ergibt ein Ergebnis vom Typ f [r]. Die einzige Sache, die mit einem forall r. Alternative f => f [r] getan werden kann, um einen f r zu produzieren, ist Index der f [r] mit irgendeiner Teilfunktion forall r. [r] -> r von einer natürlichen Zahl zu irgendeiner anderen nichtgrößeren natürlichen Zahl.

+0

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

+0

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

+0

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

Verwandte Themen