\a -> map ($ a)
ist auf jeden Fall in Ordnung, aber vielleicht noch ein bisschen schöner ist ein Applicative
Ansatz: Es gibt
<**> :: Applicative f => f a -> f (a -> b) -> f b
die <*> :: [a] -> [a->b] -> [b]
eine Instanz hat. Sieht viel wie du willst! Sie müssen nur Ihren a
Wert in eine Singleton-Liste setzen, für die es auch eine dedizierte Funktion in Applicative
: pure
gibt.
apply :: Applicative f => a -> f (a -> b) -> f b
apply = (<**>) . pure
Obwohl eigentlich, ich würde eher die Signatur a -> [a->b] -> [b]
für dieses Top-Level-Bindung beschränken, da Applicative
es, wie Sie die allgemeinste Unterschrift möglich haben aussehen lässt, was es nicht ist:
apply :: Functor f => a -> f (a -> b) -> f b
apply a = fmap ($ a)
Wirklich, meine Lösung ist wahrscheinlich am besten, wenn Sie in irgendeiner Pipeline sind, ich wage es am besten nicht zu definieren apply
aber (<**>) . pure
direkt im Code verwenden.
Nach den anwendbaren Gesetzen '((<**>). Rein) yu == u <*> rein y == pure ($ y) <*> u == fmap ($ y) für alle' Applicative's, aber die Letzteres ist nur allgemeiner. –