Was ist der Unterschied zwischen . (Punkt) und $ (dollar-Zeichen)?
Was ist der Unterschied zwischen der dot (.)
und die dollar-Zeichen ($)
?. Wie ich es verstehe, sind Sie sowohl syntaktische Zucker für nicht benötigen, Klammern zu verwenden.
InformationsquelleAutor Rabarberski | 2009-06-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
$
Betreiber ist für die Vermeidung von Klammern. Alles, was erscheint, nachdem es Vorrang über alles, was kommt vor.Zum Beispiel, sagen wir, Sie haben eine Linie, die liest:
Wenn Sie möchten, um loszuwerden, diese Klammern die folgenden Zeilen würde auch das gleiche tun:
Ist der primäre Zweck des
.
Betreiber ist nicht zu vermeiden, Klammern, sondern-chain-Funktionen. Es ermöglicht Ihnen, die Krawatte der Ausgabe von was auch immer erscheint auf der rechten Seite, um die Eingabe von was auch immer erscheint auf der linken Seite. Dies in der Regel auch zur Folge, dass weniger Klammern, aber anders funktioniert.Geht zurück auf das gleiche Beispiel:
(1 + 1)
keinen Eingang und können daher nicht verwendet werden.
Betreiber.show
können eineInt
und zurückgebenString
.putStrLn
nehmen könnenString
und eineIO ()
.Können Sie die Kette
show
zuputStrLn
wie diese:Wenn das zu viele Klammern für Ihr wünschen, Sie loszuwerden, mit der
$
Betreiber:In diesem Beispiel, so etwas wie
putStrLn . show . (+1) $ 1
gleichwertig wäre. Sie sind richtig, dass die meisten (alle?) infix-Operatoren sind Funktionen.Ich Frage mich, warum niemand jemals erwähnt, verwendet wie
map ($3)
. Ich meine, ich benutze meistens$
zu vermeiden Klammern als gut, aber es ist nicht so, das ist alles, was Sie sind da für.map ($3)
ist eine Funktion vom TypNum a => [(a->b)] -> [b]
. Es nimmt eine Liste von Funktionen, wobei eine Zahl, gilt Sie 3, um alle von Ihnen und sammelt die Ergebnisse.Sie müssen vorsichtig sein bei der Verwendung von $ mit anderen Betreibern. "x + f (y +z)" ist nicht das gleiche wie "x + f $ y + z", denn letzteres bedeutet eigentlich "(x+f) (y+z)" (d.h. die Summe von x und f als Funktion behandelt wird).
InformationsquelleAutor Michael Steele
Haben Sie unterschiedliche Typen und unterschiedliche Definitionen:
($)
ist als Ersatz für die normale Funktion der Anwendung, aber mit einer unterschiedlichen Rangfolge zur Vermeidung von Klammern.(.)
ist für die Komposition von zwei Funktionen zusammen, um eine neue Funktion.In einigen Fällen sind Sie austauschbar, aber das ist nicht wahr im Allgemeinen. Das typische Beispiel, wo Sie ist:
==>
In anderen Worten in eine Kette von
$
s, alle, aber die Letzte kann ersetzt werden durch.
x
war eine Funktion? Können Sie dann verwenden.
als die Letzte?wenn Sie tatsächlich zur Anwendung
x
in diesem Zusammenhang, dann ja - aber dann das "Finale" würde man anwendet, um etwas anderes alsx
. Wenn Sie nicht die Anwendungx
, dann ist es nicht anders zux
wobei ein Wert.InformationsquelleAutor Ganesh Sittampalam
Beachten Sie auch, dass
($)
ist die identity-Funktion spezialisierte Funktion Arten. Die identity-Funktion sieht wie folgt aus:Während
($)
sieht wie folgt aus:Beachten Sie, dass ich absichtlich Hinzugefügt extra Klammern in der Art Signatur.
Verwendet
($)
können in der Regel behoben werden, durch hinzufügen von Klammern (es sei denn, der Betreiber ist in einem Abschnitt). E. g.:f $ g x
wirdf (g x)
.Verwendet
(.)
sind oft etwas schwerer zu ersetzen; Sie müssen in der Regel eine lambda oder die Einführung einer expliziten Funktion parameter. Zum Beispiel:wird
wird
Hoffe, das hilft!
Die Art ($) ist (a -> b) ->- > b, das ist das gleiche wie (a -> b) -> (a -> b), aber die zusätzlichen Klammern hier tun, fügen Sie einige Klarheit.
Oh, nehme ich an. Ich dachte, es als eine Funktion von zwei Argumenten... aber wegen currying, es ist genau äquivalent zu einer Funktion, die zurückgibt, eine Funktion.
InformationsquelleAutor Martijn
($)
können Funktionen verkettet werden, ohne das hinzufügen von Runden Klammern zur Steuerung der Auswertung Reihenfolge:Der compose-operator
(.)
erstellt eine neue Funktion ohne Angabe von Argumenten:Obigen Beispiel ist wohl der Veranschaulichung dienen, aber zeigen nicht wirklich die Bequemlichkeit der Verwendung der Zusammensetzung. Hier ist eine andere Analogie:
Wenn wir nur verwenden, Dritten mal, können wir vermeiden, benennen Sie es mit einem lambda:
Schließlich, Zusammensetzung lässt uns vermeiden, die lambda:
InformationsquelleAutor softmechanics
Die kurze und süße version:
($)
ruft die Funktion, die der linken-hand-argument auf den Wert der rechten-hand-argument.(.)
komponiert die Funktion, die der linken-hand-argument auf die Funktion, die der rechten-hand-argument.InformationsquelleAutor ellisbben
Einer Anwendung, die nützlich ist, und nahm mir einige Zeit, um herauszufinden, aus der sehr kurzen Beschreibung zu erfahren, dass Sie eine haskell: Seit:
und parenthesizing der rechten Seite eines Ausdrucks mit ein infix-operator wandelt es zu einem Präfix-Funktion, die man schreiben kann
($ 3) (4+)
Analog zu(++", world") "hello"
.Warum würde jemand das tun? Eine Liste der Funktionen, zum Beispiel. Beide:
und:
sind kürzer als
map (\x -> x ++ ", world") ...
odermap (\f -> f 3) ...
. Offensichtlich ist die letztere Variante wäre besser lesbar für die meisten Menschen.$3
ohne den Raum. Wenn Template Haskell aktiviert ist, wird diese analysiert werden, wie eine splice, in der Erwägung, dass$ 3
immer bedeutet, was Sie sagte. Im Allgemeinen scheint es ein trend zu sein in Haskell zu "stehlen" bit-syntax, indem Sie darauf bestehen, dass bestimmte Operatoren müssen Leerzeichen um Sie als solche behandelt werden.Ich brauchte eine Weile, um herauszufinden, wie die Klammern arbeiten: en.wikibooks.org/wiki/Haskell/...
InformationsquelleAutor Christoph
... oder Sie könnte zu vermeiden, die
.
und$
Konstruktionen mithilfe pipelining:Das ist, nachdem Sie Hinzugefügt haben, in der helper-Funktion:
Eine Sache zu beachten hier ist, dass Haskell ist
$
Betreiber tatsächlich funktioniert eher wie F#'s<|
als|>
, in der Regel in haskell würden Sie schreiben die obige Funktion wie folgt:third xs = head $ tail $ tail $ xs
oder vielleicht sogar wiethird = head . tail . tail
, die in F#-syntax wäre so etwas wie dieses:let third = List.head << List.tail << List.tail
Warum sollten Sie eine Hilfsfunktion, um Haskell Aussehen F#? -1
Die Umgedrehte
$
ist bereits verfügbar, und es heißt&
hackage.haskell.org/package/base-4.8.0.0/docs/...InformationsquelleAutor user1721780
Eine großartige Möglichkeit, zu lernen, mehr über alles (jede Funktion) ist daran zu erinnern, dass alles eine Funktion! Das Allgemeine mantra hilft, aber in bestimmten Fällen, wie Betreiber, hilft es, sich daran zu erinnern, diesem kleinen trick:
und
Denken Sie nur daran,
:t
liberal, und wickeln Sie den Betreiber in()
!InformationsquelleAutor lol
Meine Regel ist einfach (ich bin Anfänger):
.
wenn Sie möchten, übergeben Sie die parameter (Aufruf der Funktion), und$
wenn es keine parameter noch (verfassen einer Funktion)Ist
aber nie:
InformationsquelleAutor halacsy
Sind Sie nicht syntaktische Zucker für nicht benötigen, Klammern zu verwenden - Sie sind Funktionen - infix, so können wir Sie nennen-Betreiber.
Komponieren,
(.)
, und wenn es zu benutzen.(.)
ist die compose-Funktion. Soist der gleiche wie der Aufbau einer Funktion übergibt das Ergebnis seines Arguments übergeben
g
auff
.Verwenden
(.)
wenn Sie nicht über die Argumente übergeben, um die Funktionen, die Sie wollen zu Komponieren.Recht assoziativen gelten,
($)
, und wenn es zu benutzen($)
ist rechts-assoziativ anwenden-Funktion mit geringer Bindung Vorrang. So ist es lediglich berechnet die Dinge, die sich rechts von der ersten. So,ist die gleiche wie diese, prozedural (welche Fragen, da Haskell ausgewertet wird träge, wird es anfangen zu bewerten
f
zuerst):oder prägnanter:
Verwenden
($)
wenn man alle Variablen zu beurteilen, bevor Sie das vorhergehende Funktion zur Folge haben.Sehen wir dies durch das Lesen der Quelle für jede Funktion.
Lesen Quelle
Hier ist die Quelle für
(.)
:Und hier ist die Quelle für
($)
:Abschluss
Nutzen Zusammensetzung, wenn Sie nicht brauchen, um sofort die Funktion ausgewertet werden soll. Vielleicht möchten Sie übergeben der Funktion, die Ergebnisse aus der Zusammensetzung zu einer anderen Funktion.
Anwendung verwenden, wenn Sie liefert alle Argumente, die für eine vollständige Beurteilung.
Also für unser Beispiel wäre es semantisch vorzuziehen, zu tun,
wenn wir
x
(oder vielmehrg
's Argumente), und tun:wenn wir nicht.
InformationsquelleAutor Aaron Hall
Ich denke ein kurzes Beispiel, wo würden Sie
.
und nicht$
würde helfen, zu klären Dinge.Beachten Sie, dass
times6
ist eine Funktion, die erstellt wird, aus der Funktion, Zusammensetzung.InformationsquelleAutor Brennan Cheung
Alle anderen Antworten sind ziemlich gut. Aber es ist ein wichtiger usability-Details darüber, wie ghc behandelt $,, dass der ghc-Typ-checker ermöglicht instatiarion mit höherem Rang/quantifiziert Arten. Wenn Sie Aussehen bei das Art von
$ id
finden Sie zum Beispiel it ' s gonna take eine Funktion, deren argument selbst ist eine polymorphe Funktion. Kleine Dinge wie, dass sind nicht die gleiche Flexibilität mit einem äquivalent verärgert Betreiber. (Eigentlich wundert mich, wenn $! verdient die gleiche Behandlung oder nicht )InformationsquelleAutor Carter Tazio Schonwald