Es gibt über Applicative
nicht einen eigenen Transformator Klasse benötigen, wie dies eine Menge Diskussion:Sind Applikationstransformatoren wirklich überflüssig?
class AppTrans t where
liftA :: Applicative f => f a -> t f a
Aber ich kann applicative Transformatoren definieren, die Zusammensetzungen von applicatives zu sein scheinen nicht! Zum Beispiel sideeffectful Ströme:
data MStream f a = MStream (f (a, MStream f a))
Lifting führt nur die Nebenwirkung bei jedem Schritt:
instance AppTrans MStream where
liftA action = MStream $ (,) <$> action <*> pure (liftA action)
Und wenn f
ein applicative ist, dann MStream f
ist auch:
instance Functor f => Functor (MStream f) where
fmap fun (MStream stream) = MStream $ (\(a, as) -> (fun a, fmap fun as)) <$> stream
instance Applicative f => Applicative (MStream f) where
pure = liftA . pure
MStream fstream <*> MStream astream = MStream
$ (\(f, fs) (a, as) -> (f a, fs <*> as)) <$> fstream <*> astream
Ich weiß, dass für alle praktischen Zwecke f
sollte eine Monade sein:
joinS :: Monad m => MStream m a -> m [a]
joinS (MStream stream) = do
(a, as) <- stream
aslist <- joinS as
return $ a : aslist
Aber während es eine Monad
Instanz für MStream m
ist, es ist ineffizient. (Oder sogar falsch?) Die Applicative
Instanz ist tatsächlich nützlich!
Nun beachten Sie, dass übliche Ströme als Sonderfälle für die Identität Funktors entstehen:
import Data.Functor.Identity
type Stream a = MStream Identity a
Aber die Zusammensetzung von Stream
und f
nicht MStream f
ist! Eher ist Compose Stream f a
isomorph zu Stream (f a)
.
Ich würde gerne wissen, ob MStream
eine Zusammensetzung von zwei Anwendungen ist.
Edit:
Ich möchte eine Kategorie theoretische Sicht bieten. Ein Transformator ist ein "netter" Endofaktor t
in der Kategorie C
von anwendungsbezogenen Funktoren (d. H. Laxe monoidale Funktoren mit Festigkeit) zusammen mit einer natürlichen Transformation liftA
von der Identität auf bis t
. Die allgemeinere Frage ist nun, welche nützlichen Transformatoren existieren, die nicht die Form "compose with g
" haben (wobei g
ein Anwendungsfall ist). Meine Behauptung ist, dass MStream
einer von ihnen ist.