Angenommen, ich habe einen Datentyp A
, die Anwendung ist. (Für das Beispiel können wir annehmen, dass A
Identity
ist).Anwendbare Instanz für Funktionen von der gleichen Domäne zu Applicative
Ich habe nun einen neuen Datentyp, der von einem A
zum anderes zu der „Transformation“ entspricht:
data B a b = B (A a -> A b)
I die triviale Applicative Instanz für (B a)
definiert werden soll, der eine neue Transformation erzeugt, die beiden Argumente gelten von <*>
an seinem Eingang und verwendet dann die Definition von < *> von der Applicative Instanz von A.
formulieren dies einfach genug ist:
instance Applicative (B a) where
pure x = B $ const $ pure x
(B ftrans) <*> (B xtrans) = B fxtrans
where fxtrans inp = let fout = ftrans inp
xout = xtrans inp
in fout <*> xout
Allerdings habe ich das Gefühl, dass es eine einfache, pointfree Möglichkeit geben sollte, dies zu schreiben, indem man die Tatsache verwendet, dass (-> a)
ein Applicative Functor ist.
Als eine Probe von dem, was ich im Sinne habe, meine Definition der entsprechenden Functor Instanz betrachten:
instance Functor (B a) where
fmap f (B xtrans) = B $ (fmap f) <$> xtrans
Gibt es eine ähnlich einfache Weise die Applicative Instanz zu definieren?
Wäre es richtig zu sagen, dass "B a b" in der Frage äquivalent zu "Typ B a = Compose ((->) (A a)) A" ist? –
@ChristianConkle: Ja. –