Haskell: Wie ist <*> ausgesprochen?
Wie spricht man diese Funktionen in der Applicative typeclass:
(<*>) :: f (a -> b) -> f a -> f b
(*>) :: f a -> f b -> f b
(<*) :: f a -> f b -> f a
(Das ist, wenn Sie nicht die Betreiber, was könnten Sie genannt werden?)
Als Seite beachten, wenn Sie sich umbenennen könnte pure
etwas freundlicher zu nicht-Mathematiker, wie würdest du es nennen?
Cooper... würden Sie in der Lage sein zu hören, wie wir das aussprechen? 🙂 Wollen Sie vielleicht die post eine Anfrage über meta.stackoverflow.com für eine voice-Aufnahme-und-Wiedergabe-Funktion :).
Es ist ausgesprochen "Gute Trauer, Sie waren wirklich läuft out-of-Betreiber, waren Sie nicht?" Auch ein guter name für
foh-net-iks
(<*>) ist die Kontrolle.Applicative-version der Steuerung.Monade "ap", so "ap" ist wohl der passendste name.
würde ich es nennen, ein Zyklop, aber das ist nur mir.
Es ist ausgesprochen "Gute Trauer, Sie waren wirklich läuft out-of-Betreiber, waren Sie nicht?" Auch ein guter name für
pure
könnte makeApplicative
.foh-net-iks
(<*>) ist die Kontrolle.Applicative-version der Steuerung.Monade "ap", so "ap" ist wohl der passendste name.
würde ich es nennen, ein Zyklop, aber das ist nur mir.
InformationsquelleAutor J Cooper | 2010-07-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wissen, Ihre mathematischen, oder nicht, ist weitgehend irrelevant ist hier, glaube ich. Wie Sie wahrscheinlich wissen, Haskell, leiht sich ein paar bits von Terminologie aus verschiedenen Bereichen der abstrakten Mathematik, insbesondere Kategorie Theorie, von Woher erhalten wir funktoren und Monaden. Die Verwendung dieser Begriffe in Haskell unterscheidet sich etwas von der formalen mathematischen Definitionen, aber Sie sind in der Regel nahe genug, um gut zu sein, beschreibende Begriffe jedenfalls.
Den
Applicative
Typ der Klasse sitzt irgendwo zwischenFunctor
undMonad
, so würde man erwarten, dass es eine ähnliche mathematische Grundlage. Die Dokumentation für dieControl.Applicative
Modul beginnt mit:Hmm.
Nicht ganz so eingängig wie
Monad
, denke ich.Was das alles im Grunde läuft darauf hinaus, dass
Applicative
entspricht nicht irgendein Konzept, dass besonders interessante mathematisch, also es gibt keine fertigen Begriffe herumliegen, die Art einzufangen, wie es s verwendet in Haskell. Also, legen Sie die Mathematik beiseite für jetzt.Wollen wir wissen, was zu nennen
(<*>)
könnte es helfen, zu wissen, was es im Grunde bedeutet.Also, was ist Los mit
Applicative
, sowieso, und warum tun wir es so nennen?Was
Applicative
beträgt in der Praxis ist ein Weg zu heben beliebigen Funktionen in einemFunctor
. Betrachten Sie die Kombination vonMaybe
(wohl die einfachste nicht-trivialeFunctor
) undBool
(ebenso ist die einfachste nicht-triviale Daten-Typ).Die Funktion
fmap
können uns hebennot
von der Arbeit aufBool
zu arbeitenMaybe Bool
. Aber was ist, wenn wir wollen, zu heben(&&)
?Gut, das ist nicht das, was wir wollen an alle! In der Tat, es ist ziemlich nutzlos. Wir können versuchen, schlau zu sein und schleichen sich andere
Bool
inMaybe
durch die Hintertür......aber das ist nicht gut. Für eine Sache, es ist falsch. Für anderen Sache, es ist hässlich. Wir könnten es weiter versuchen, aber es stellt sich heraus, dass es kein Weg zu heben eine Funktion mehrere Argumente mit der Arbeit an einer beliebigen
Functor
. Ärgerlich!Auf der anderen Seite, wir könnten es einfach tun, wenn wir
Maybe
'sMonad
Beispiel:Nun, das ist eine Menge Aufwand nur um zu übersetzen, die eine einfache Funktion-das ist, warum
Control.Monad
bietet eine Funktion, um es automatisch zu tun,liftM2
. Die 2 in der name bezieht sich auf die Tatsache, dass es funktioniert auf die Funktion von genau zwei Argumente; ähnliche Funktionen gibt es für 3, 4 und 5 argument-Funktionen. Diese Funktionen sind besser, aber nicht perfekt, und die Angabe der Anzahl der Argumente ist hässlich und unbeholfen.Das bringt uns zu der Papier eingeführt wurde Applicative class-Typ. In es, machen die Autoren im wesentlichen zwei Beobachtungen:
Functor
ist eine sehr Natürliche Sache zu tunMonad
Normale Funktion der Anwendung ist schriftlich durch einfache Nebeneinanderstellung der Begriffe, also um "gehoben Anwendung" so einfach und natürlich wie möglich, das Papier führt infix-Operatoren stehen für die Anwendung, hob in der
Functor
, und einer Typ-Klasse zu bieten, was gebraucht wird.All dies bringt uns zu dem folgenden Punkt:
(<*>)
einfach darstellt, Funktion, Anwendung-warum also sprechen es anders ab, als Sie den Leerraum "nebeneinander-operator"?Aber wenn das nicht sehr befriedigend ist, können wir beobachten, dass die
Control.Monad
Modul bietet auch eine Funktion, die tut die gleiche Sache für Monaden:Wo
ap
ist, natürlich, kurz für "anwenden". Da jedeMonad
werden kannApplicative
, undap
muss nur die Teilmenge der Funktionen in der letzteren können wir vielleicht sagen, dass wenn(<*>)
nicht ein Betreiber, es sollte aufgerufen werdenap
.Können wir auch Dinge Herangehen von der anderen Richtung. Die
Functor
lifting-operation aufgerufen wirdfmap
weil es eine Verallgemeinerung dermap
operation auf Listen. Welche Art von Funktion, die auf Listen arbeiten würde, wie(<*>)
? Gibt ' s wasap
auf Listen, natürlich, aber das ist nicht besonders nützlich auf seine eigene.In der Tat, es gibt vielleicht noch mehr Natürliche Deutung für Listen. Was kommt in den Sinn, wenn Sie sich in den folgenden geben Sie die Signatur?
Es gibt etwas, nur so verlockend die Idee von Futter die Listen parallel, die Anwendung jeder Funktion die erste, um das entsprechende element der zweiten. Leider für unseren alten Freund
Monad
diese einfache Bedienung gegen die Monaden-Gesetze, wenn die Listen sind unterschiedlich lang. Aber es macht einen feinenApplicative
, in dem Fall(<*>)
wird zu einem Aneinanderreihung einer verallgemeinerten version vonzipWith
, so können wir uns vielleicht vorstellen, nannte esfzipWith
?Diese zippen Idee eigentlich bringt uns der Kreis. Daran erinnern, dass Mathe Zeug früher über monoidale funktoren? Wie der name schon sagt, sind eine Art Kombination der Struktur eines monoiden und funktoren, die beide vertraut sind Haskell-Typklassen:
Was würden diese Aussehen, wenn Sie setzen Sie Sie in einer box zusammen und schüttelte es ein wenig? Von
Functor
wir halten die Idee einer Struktur unabhängig von dessen Typ-parameter, und vonMonoid
wir sorgen dafür, dass die Allgemeine form der Funktionen:Wir wollen nicht davon ausgehen, dass es ein Weg, um eine wirklich "leer"
Functor
, und wir können nicht zaubern einen Wert eines beliebigen Typs, so dass wir beheben die Art dermfEmpty
alsf ()
.Wir auch nicht wollen, zwingen
mfAppend
zu müssen, um ein konsistentes Typ-parameter, also müssen wir jetzt diese:Was ist das Ergebnis geben Sie für
mfAppend
? Wir haben zwei beliebigen Typen, die wir nichts wissen, so haben wir nicht viele Optionen. Das vernünftigste ist, einfach beide behalten:An welcher Stelle
mfAppend
ist nun deutlich eine generalisierte version vonzip
auf Listen, und wir können rekonstruierenApplicative
einfach:Dies zeigt uns auch, dass
pure
ist in Bezug auf die Identität element einerMonoid
, so dass andere gute Namen für Sie es könnte alles sein, was ein Gerät Wert ist, eine null-operation, oder so.War langwierig, um es zusammenzufassen:
(<*>)
ist nur eine modifizierte Funktion-Anwendung, so können Sie entweder Lesen wie "ap" oder "übernehmen", oder zu umgehen, aber es ganz so, als würden Sie die normale Funktion der Anwendung.(<*>)
auch grob verallgemeinertzipWith
auf Listen, so kann man es Lesen als "zip-funktoren mit", ähnlich wie zu Lesenfmap
als "Karte einen Funktor mit".Die erste ist näher an der Absicht des
Applicative
Typ-Klasse-wie der name vermuten lässt--so das ist, was ich empfehlen.In der Tat, ich ermutige liberale verwenden, und nicht die Aussprache, der alle gehoben Anwendung von Operatoren:
(<$>)
, das hebt ein single-argument-Funktion in einemFunctor
(<*>)
, die Ketten ein multi-argument-Funktion durch eineApplicative
(=<<)
, die bindet, eine Funktion, die in eineMonad
auf eine bestehende BerechnungAlle drei sind im Kern ganz normale Funktion, Anwendung, gewürzt ein bisschen.
Applicative
und die funktionale idiomatischen Stil fördert Sie bekommen nicht genug Liebe, so konnte ich nicht widerstehen, die chance, Sie zu loben, seine Tugenden, ein bisschen wie ein Mittel, zu erklären, wie ich (nicht) auszusprechen(<*>)
.+1! Bitte fühlen Sie sich frei, um in ähnlicher Weise langatmig an stackoverflow.com/questions/2104446/...
Würde, dass Haskell hatte syntax-Zucker für
Applicative
's! So etwas wie[| f a b c d |]
(wie vorgeschlagen von der original-Papier). Dann würden wir nicht brauchen, die<*>
combinator und Sie finden würde, ein solcher Ausdruck als Beispiel "- Funktion, Anwendung in einer functorial Kontext"Nein, ich meinte
Monad
. OderFunctor
oderMonoid
oder irgendetwas anderes, das ist ein etablierter Begriff, der mit weniger als drei Adjektive. "Applicative" bloß eine trockene, wenn auch einigermaßen aussagekräftigen, Namen schlug auf etwas, das eher erforderlich.siehe [stackoverflow.com/questions/12014524/..., wo die freundlichen Menschen, der mir zeigte, zwei Möglichkeiten, um fast-notation.
InformationsquelleAutor C. A. McCann
Da habe ich keine Ambitionen, weiter zu verbessern C. A. McCann technische Antwort, ich werde angehen, die mehr flauschige:
Als alternative, vor allem, da es kein Ende in dem ständigen angst-und-Verrat-gefüllt rief gegen die
Monad
version, genannt "return
", schlage ich einen anderen Namen, das deutet auf Ihre Funktion in einer Weise gerecht werden kann, dass die meisten Imperativ der Imperativ Programmierer, und die meisten funktionalen...naja, hoffentlich, meckern kann jeder, das gleiche zu:inject
.Wert. "Injizieren" Sie in den
Functor
,Applicative
,Monad
oder was-haben-Sie. Ich Stimme für die "inject
", und ich billigte diese Meldung.inject
ist einen hervorragenden Namen und wahrscheinlich auch besser als meine, aber als eine kleine Randnotiz, "Spritzen" ist in-ich glaube-Smalltalk und Ruby für einen Links-Falten-Methode einiger Sortieren. Ich habe nie verstanden, dass die Wahl des namens, aber...Dies ist ein sehr Alter thread, aber ich denke, dass
inject
in Ruby & Smalltalk wird verwendet, weil es ist so wie du "Injektion" ein operator zwischen jedes element in der Liste. Mindestens, das ist, wie ich immer dachte.auch abholen, die alte Seite-thread: Sie sind nicht gespritzt Operatoren, die Sie ersetzen (eliminieren) Konstruktoren, die sind schon da. (Betrachtet den anderen Weg, du bist Injektion alten Daten in einen neuen Typ.) Für Listen, die Beseitigung ist nur
foldr
. (Sie ersetzen(:)
und[]
, wo(:)
nimmt 2 Argumente und[]
ist eine Konstante, daherfoldr (+) 0 (1:2:3:[])
↝1+2+3+0
.) AufBool
es ist nurif
-then
-else
(zwei Konstanten, pick) und fürMaybe
es heißtmaybe
... Haskell hat keine single-name/Funktion für diese, da alle verschiedene Typen haben (im Allgemeinen elim ist nur Rekursion/Induktion)Smalltalk bekam diesen Namen von eine Arlo Guthrie-song über den Entwurf für den Vietnam-Krieg, in dem unglücklichen Jungen Männer wurden gesammelt, ausgewählt, werden manchmal abgelehnt, und auch sonst, injiziert.
InformationsquelleAutor BMeph
In Kürze:
<*>
Sie können es nennen, gelten. SoMaybe f <*> Maybe a
ausgeprägt sein kann, als geltenMaybe f
überMaybe a
.Könnte man umbenennen
pure
zuof
, wie viele JavaScript-Bibliotheken tun. In JS erstellen Sie eineMaybe
mitMaybe.of(a)
.Auch, Haskell-wiki hat eine Seite, die auf die Aussprache der Sprache Operatoren hier
InformationsquelleAutor Marcelo Lazaroni
Quelle: Haskell Programmierung aus Ersten Prinzipien, von Chris Allen und Julie Moronuki
warten für die nächste generation von Haskellers, sind mit diesem Buch als primären Lern-material.
Es könnte passieren. Die Namen sind schrecklich, denn Sie haben keine Verbindung zu den Bedeutungen.
Ich sehe nicht, eine gute Lösung überall. "ap" / "anwenden" ist so vage wie "tie fighter". Alles ist Funktion Anwendung. Aber ein name kommt aus dem blau erwerben könnten, Bedeutung durch Gebrauch. "Apple" ist ein gutes Beispiel. Durch die Art und Weise, Monade return ist Applicative rein. Keine Erfindungen hier.
InformationsquelleAutor dmvianna