Ich lerne Haskells Bewerber. Es scheint mir (ich liege wahrscheinlich falsch), dass diepure
Funktion nicht wirklich benötigt wird, zum Beispiel:
pure (+) <*> [1,2,3] <*> [3,4,5]
kann geschrieben werden als
(+) <$> [1,2,3] <*> [3,4,5]
Kann jemand den Nutzen erklären, den die pure
Funktion gegenüber der expliziten Zuordnung bietet fmap
?
haskell
applicative
Gil Shafriri
quelle
quelle
pure f <*> x
ist genau das gleiche wiefmap f x
. Ich bin mir sicher, dass es einen Grund gibt, warum diespure
aufgenommen wurdeApplicative
, aber ich bin mir nicht ganz sicher, warum.pure
ermöglicht es einem, "reine" Werte in einer anwendbaren Berechnung zu verwenden. Während, wie Sie richtig beobachten,pure f <*> x
dasselbe ist wief <$> x
, gibt es kein solches Äquivalent für beispielsweisef <*> x <*> pure y <*> z
. (Zumindest glaube ich nicht.)Monoid
Klasse verknüpft -, diepure
demMonoid
Identitätselement entspricht. (Dies deutet darauf hin, dassApplicative
ohnepure
interessant sein könnte, daSemigroup
- was ein ist,Monoid
ohne unbedingt eine Identität zu haben - immer noch verwendet wird. Eigentlich denke ich jetzt daran, dass PureScript genau eine solchepure
Klasse "Applikativ ohne " hat, obwohl ich es nicht tue Ich weiß nicht, wofür es verwendet wird.)fmap (\f' x' z' -> f' x' y z') f <*> x <*> z
, denke ich. Die Idee ist in derApplicative
Dokumentation als Gesetz des "Austauschs".Applicative
ohnepure
existiert wieApply
von Semigroupoiden .Antworten:
Ich bin hier am Rande meiner Kompetenz, also nimm das nicht länger als es ist, aber es war ein bisschen zu lang für einen Kommentar.
Es mag praktische Gründe geben,
pure
in die Typklasse aufgenommen zu werden, aber viele Haskell-Abstraktionen leiten sich aus theoretischen Grundlagen ab, und ich glaube, dass dies auch der Fall istApplicative
. Wie in der Dokumentation angegeben, handelt es sich um einen starken laxen monoidalen Funktor ( eine Erläuterung finden Sie unter https://cstheory.stackexchange.com/q/12412/56098 ). Ich nehme an, daspure
dient genau wie die Identitätreturn
fürMonad
(was ein Monoid in der Kategorie der Endofunktoren ist ).Erwägen
pure
undliftA2
:Wenn Sie ein wenig blinzeln, können Sie sich vielleicht vorstellen, dass
liftA2
es sich um eine binäre Operation handelt. Dies steht auch in der Dokumentation:pure
ist also die entsprechende Identität.quelle
Applicative
ohnepure
wäre ein, hm, halbgruppaler Funktor anstelle eines monoidalen.fmap
schneidet es nicht immer. Insbesonderepure
können Sief
(wof
istApplicative
) vorstellen, wo Sie es noch nicht haben. Ein gutes Beispiel istEs nimmt eine Liste von "Aktionen", die Werte erzeugen, und verwandelt sie in eine Aktion, die eine Liste von Werten erzeugt. Was passiert, wenn die Liste keine Aktionen enthält? Das einzig vernünftige Ergebnis ist eine Aktion, die keine Werte erzeugt:
Wenn Sie dies nicht getan hätten
pure
, müssten Sie eine nicht leere Liste von Aktionen anfordern. Sie könnten es definitiv zum Laufen bringen, aber es ist, als würde man über Addition sprechen, ohne 0 zu erwähnen, oder Multiplikation ohne 1 (wie andere gesagt haben, weilApplicative
s monoidal sind). Sie werden wiederholt auf Randfälle stoßen, die leicht zu lösen wären,pure
aber stattdessen durch seltsame Einschränkungen Ihrer Eingaben und anderer Pflaster gelöst werden müssen.quelle