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?

War es hilfreich?

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,

(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.

Microsoft :

  

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top