Was bedeutet -> in F # bedeuten?
-
01-07-2019 - |
Frage
Ich habe versucht, in F # für eine Weile auf und ab zu bekommen, aber ich halte aufschieben zu werden. Warum?
Denn egal, was für Anfänger "Ressource Ich versuche zu sehen ich sehr einfache Beispiele sehen, die die Bediener ->
beginnen.
Allerdings haben nirgends fand ich noch, dass bietet eine klare einfache Erklärung dessen, was dieser Operator bedeutet. Es ist, als ob es so offensichtlich sein, dass es nicht Erklärung braucht auch Neulinge zu beenden.
Ich muss also wirklich dicht sein oder es ist vielleicht fast drei Jahrzehnte Erfahrung hält mich zurück.
Kann jemand bitte, erklären oder zeigen Sie auf eine wirklich zugänglich Ressource, die es erklärt?
Lösung
'->' ist kein Operator. Es erscheint in der F # Syntax in einer Reihe von Orten, und seine Bedeutung hängt davon ab, wie es als Teil eines größeren Konstrukts verwendet wird.
Innerhalb eines Typs ‚->‘ beschreibt Funktionstypen wie Menschen oben beschrieben haben. Zum Beispiel
let f : int -> int = ...
sagt, dass ‚f‘ eine Funktion, die einen int nimmt und gibt ein int.
In einem Lambda ( „Sache, die mit‚Spaß‘Schlüsselwort beginnt“), ‚->‘ ist Syntax, die die Argumente vom Körper trennt. Zum Beispiel
fun x y -> x + y + 1
ist ein Ausdruck, der eine Zweiargumentfunktion mit der gegebenen Implementierung definiert.
Innerhalb einer „Übereinstimmung“ konstruieren, ‚->‘ Syntax ist, die Muster aus dem Code trennt, die, wenn das Muster abgestimmt ist ausgeführt werden soll. Zum Beispiel in
match someList with
| [] -> 0
| h::t -> 1
das Zeug links von jeder ‚->‘. Sind Muster, und das Zeug auf der rechten Seite ist das, was passiert, wenn das Muster auf der linken Seite angepasst wurde
Die Schwierigkeit beim Verständnis kann in der fehlerhaften Annahme, verwurzelt sein, dass ‚->‘ ist „ein Operator“ mit einer einzigen Bedeutung. Eine Analogie könnte „“ in C #, wenn Sie noch nie einen Code gesehen haben, und versuchen, das zu analysieren „“ Betreiber basierend auf der Suche auf „obj.Method“ und „3,14“ und „System.Collections“, können Sie sehr verwirrt, weil das Symbol verschiedene Bedeutungen in verschiedenen Kontexten hat. Sobald Sie genug von der Sprache kennen diese Zusammenhänge zu erkennen, jedoch werden die Dinge klar.
Andere Tipps
Im Grunde bedeutet es „Karten“. Lesen Sie es auf diese Weise oder als „verwandelt sich in“ oder so ähnlich.
Also, von der F # in 20 Minuten Tutorial
> List.map (fun x -> x % 2 = 0) [1 .. 10];;
val it : bool list
= [false; true; false; true; false; true; false; true; false; true]
Der Code (fun i -> i% 2 = 0) definiert eine anonyme Funktion, eine so genannte Lambda Expression, die einen Parameter x ist und die Funktion gibt das Ergebnis von „x % 2 = 0" , das anzeigt, ob oder nicht ist, ist x selbst.
Die erste Frage - sind Sie mit Lambda-Ausdrücke in C # vertraut? Wenn dem so ist die -> in F # die gleichen wie die = ist> in C # (ich glaube, Sie lesen 'geht an')
.Der Operator -> kann auch im Zusammenhang mit Muster gefunden werden passende
match x with
| 1 -> dosomething
| _ -> dosomethingelse
Ich bin nicht sicher, ob dies auch ein Lambda-Ausdruck ist, oder etwas anderes, aber ich denke, das hält ‚zu geht‘ nach wie vor.
Vielleicht, was Sie sich beziehen wirklich ist die F # Parsers 'kryptischen Antworten:
> let add a b = a + b
val add: int -> int -> int
Diese Mittel (wie die meisten Beispiele erklären), die eine ‚val‘ hinzuzufügen ist, die zwei Ints nimmt und gibt ein int. Für mich war dies völlig undurchsichtig zu beginnen. Ich meine, wie kann ich wissen, dass Add keine val ist, die ein int nimmt und zwei Ints?
Nun, die Sache ist, dass in einem gewissen Sinne, es tut. Wenn ich nur ein int geben hinzufügen, bekomme ich wieder ein (int -> int):
> let inc = add 1
val inc: int -> int
Das (currying) ist eines der Dinge, die so sexy F #, für mich macht.
Für hilfreiche Informationen über F #, habe ich festgestellt, dass Blogs sind viel nützlicher, dass jede der offiziellen ‚Dokumentation‘: Hier einige Namen sind zu überprüfen,
- Dustin Campbell (das ist diditwith.net, in einer anderen Antwort zitiert)
- Don Symes (im Folgenden: 'Mann)
- Tomasp.net (auch bekannt als Tomas Petricek )
- Andrew Kennedy (für Maßeinheiten)
- Fsharp.it (berühmt für das Projekt Euler-Lösungen)
- http://lorgonblog.spaces.live.com/Blog (auch bekannt als Brian )
- Jomo Fisher
(a -> b) bedeutet "Funktion von a nach b". Bei Typ-Annotation, bezeichnet er einen Funktionstyp. Zum Beispiel F: (int -> String) bedeutet, dass f an eine Funktion bezeichnet, die eine ganze Zahl und gibt eine Zeichenfolge erfolgt. Es wird auch als contstructor solcher Werte verwendet, wie in
val f : (int -> int) = fun n -> n * 2
, die einen Wert erzeugt, der eine Funktion von einer Anzahl n an derselben Zahl multipliziert mit zwei.
Es gibt viele gute Antworten hier schon, ich möchte nur, um das Gespräch darüber nachzudenken, es eine andere Art und Weise hinzuzufügen.
'->' bedeutet Funktion.
'a ->' b ist eine Funktion, die ein 'a und gibt einen' nimmt b
( 'a * 'b) -> (' * c 'd) ist eine Funktion, die ein Tupel vom Typ nimmt (' a ' b) und gibt ein Tupel von (' c', d). Wie int / string kehrt float / char.
Wo es interessant ist in der Kaskade Fall von 'a ->' b -> ‚c. Dies ist eine Funktion, die eine dauert 'a und gibt eine Funktion (' B -> 'c) oder eine Funktion, die eine dauert' b. -> ‚c
Also, wenn Sie schreiben: sei f x y z = ()
Der Typ wird f: 'a ->' b -> 'c -> Einheit, wenn Sie also nur den ersten Parameter angewandt wird, wäre das Ergebnis eine curried Funktion' b -> 'c ->' Einheit.
Funktionstypen sind die Typen gegeben First-Class-Funktionswerte und sind geschrieben int -> int. Sie sind sich ähnlich .NET Delegattypen, außer sie werden keine Namen gegeben. Alle F # Funktion Bezeichner kann als First-Class verwendet werden Funktionswerte und anonym Funktionswerte können erstellt werden mit das. (fun ... -> ...) Ausdrucksform
Viele große Antworten auf diese Fragen, dank Menschen. Ich möchte hier eine editierbare Antwort setzen, die Dinge zusammenbringt.
Für diejenigen, die mit C # Verständnis -> ist die gleiche wie => lamba Ausdruck ist ein guter erster Schritt. Diese Nutzung ist: -
fun x y -> x + y + 1
Kann als äquivalent verstanden werden: -
(x, y) => x + y + 1;
Allerdings ist klar, dass -> hat eine fundemental Bedeutung, die vom Konzept stammt, das eine Funktion, die reduziert werden kann zwei Parameter, wie die oben nimmt (ist das der richtige Begriff?) Zu einer Reihe von Funktionen nur einen Parameter nehmen.
Wenn daher die oben beschrieben in wie folgt aus: -
Int -> Int -> Int
Es hat mir sehr geholfen, das zu wissen -> stimmt assoziativen somit über die in Betracht gezogen werden: -
Int -> (Int -> Int)
Aha! Wir haben eine Funktion, die Int und kehrt (Int -> Int) nimmt (a curried Funktion?)
.Die explaination, die -> kann auch ein Teil des Typs definiton erscheinen als auch geholfen. (Int -> Int) ist die Art von jeder Funktion, die eine Int nimmt und gibt eine Int
.Auch hilfreich ist die -> erscheint in anderer Syntax wie passend, aber es ist es nicht die gleiche Bedeutung hat? Ist das korrekt? Ich bin nicht sicher, ob es ist. Ich vermute, dass es die gleiche Bedeutung hat, aber ich habe nicht das Vokabular, das noch zum Ausdruck bringen.
Beachten Sie die Zwecke dieser Antwort ist nicht weiter Antworten zum Laichen aber kollaborativ bearbeitet von Ihnen Menschen werden, um eine endgültige Antwort zu erstellen. Utlimately wäre es gut, dass alle Unsicherheiten und Fluf (wie dieser Absatz) und bessere Beispiele hinzugefügt entfernt werden. Versuchen sie diese Antwort so zugänglich halten für die Uneingeweihten wie möglich.
Im Rahmen eine Funktion zu definieren, ist es ähnlich aus dem Lambda-Ausdruck in C # 3.0 =>
.
F#: let f = fun x -> x*x
C#: Func<int, int> f = x => x * x;
Die ->
in Fis auch in Mustererkennung verwendet wird, wo es heißt: wenn der Ausdruck den Teil zwischen |
und ->
übereinstimmt, dann was kommt nach ->
als Ergebnis zurückgegeben werden soll:
let isOne x = match x with
| 1 -> true
| _ -> false
Das Schöne an Sprachen wie Haskell (es ist sehr ähnlich in F #, aber ich weiß nicht, die genaue Syntax - dies sollte Ihnen helfen zu verstehen ->, obwohl) ist, dass Sie nur Teile des Arguments anwenden können, erstellen curried Funktionen:
adder n x y = n + x + y
Mit anderen Worten: „Gib mir drei Dinge, und ich werde sie fügen zusammen“. Wenn Sie Zahlen um sich werfen, wird der Compiler die Typen von n x und y ableiten. Sagen Sie bitte schreiben
adder 1 2 3
Der Typ von 1, 2 und 3 ist Int. Deshalb:
adder :: Int -> Int -> Int -> Int
Das heißt, geben Sie mir drei ganze Zahlen, und ich werde eine ganze Zahl worden, schließlich, oder dasselbe wie zu sagen:
five :: Int
five = 5
Aber hier ist das schöne Teil! Versuchen Sie folgendes:
add5 = adder 5
Wie Sie sich erinnern, nimmt Addierer einen int, ein int, ein int und gibt Ihnen einen int zurück. Aber das ist nicht die ganze Wahrheit, wie Sie gleich sehen werden. In der Tat hat ADD5 diese Art:
add5 :: Int -> Int -> Int
Es ist, als ob Sie „abgeschält“ der ganzen Zahlen haben (der am weitesten links) und verklebt sie direkt an die Funktion. Bei genauerer Betrachtung der Funktionssignatur, bemerken wir, dass die -> sind rechtsassoziativ, das heißt:
.addder :: Int -> (Int -> (Int -> Int))
Dies sollte es ganz klar machen: Wenn Sie Addierer die erste Ganzzahl eingeben, um es zu was auch immer dem rechts von dem ersten Pfeil bewerten werden, oder:
add5andtwomore :: Int -> (Int -> Int)
add5andtwomore = adder 5
Jetzt können Sie add5andtwomore statt „Addierer 5“ verwenden. Auf diese Weise können Sie eine andere ganze Zahl anwenden zu bekommen (sagen wir) „add5and7andonemore“:
add5and7andonemore :: Int -> Int
add5and7andonemore = adder 5 7
Wie Sie sehen, add5and7andonemore will genau ein weiteres Argument, und wenn Sie es eine geben, wird es plötzlich eine ganze Zahl geworden!
> add5and7andonemore 9
=> ((add5andtwomore) 7) 9
=> ((adder 5) 7) 9)
<=> adder 5 7 9
, die Parameter zu Addierer (n x y) für (5 7 9) Substituieren erhalten wir:
> adder 5 7 9 = 5 + 7 + 9
=> 5 + 7 + 9
=> 21
In der Tat , und ist auch nur eine Funktion, die einen int nimmt und gibt Ihnen eine weitere int zurück, so dass die oben ist wirklich mehr wie:
> 5 + 7 + 9
=> (+ 5 (+ 7 9))
=> (+ 5 16)
=> 21
Dort gehen Sie!