This sample will guide you through elements of the F# language. Dieses Beispiel zeigt Ihnen verschiedene Elemente der F#-Programmiersprache. To execute the code in F# Interactive, highlight a section of code and press Alt-Enter or right-click Markieren Sie zum Ausführen des Codes in F# Interactive einen Codeabschnitt, und drücken Sie dann entweder ALT+EINGABETASTE oder klicken Sie mit der rechten Maustaste and select "Execute in Interactive". You can open the F# Interactive Window from the "View" menu. und wählen Sie "In Interactive ausführen" aus. Sie können das F# Interactive-Fenster über das Menü "Ansicht" öffnen. For more about F#, see: Weitere Informationen zu F# finden Sie unter: To see this tutorial in documentation form, see: Dieses Tutorial ist auch als Dokumentation verfügbar. Siehe hierzu: To learn more about applied F# programming, use Verwenden Sie Folgendes, um weitere Informationen zur praktischen F#-Programmierung zu erhalten: To install the Visual F# Power Tools, use Verwenden Sie Folgendes, um die Visual F# Power Tools zu installieren: 'Tools' --> 'Extensions and Updates' --> `Online` and search "Extras" > "Erweiterungen und Updates" > "Online", und suchen Sie nach For additional templates to use with F#, see the 'Online Templates' in Visual Studio, Weitere Vorlagen zum Verwenden mit F# finden Sie in Visual Studio unter "Onlinevorlagen", 'New Project' --> 'Online Templates' "Neue Projekte" > "Onlinevorlagen". F# supports three kinds of comments: F# unterstützt drei Arten von Kommentaren: 1. Double-slash comments. These are used in most situations. 1. Kommentare mit doppeltem Schrägstrich. Diese werden in den meisten Situationen verwendet. 2. ML-style Block comments. These aren't used that often. 2. Blockkommentare im ML-Stil. Diese werden nicht sehr häufig verwendet. 3. Triple-slash comments. These are used for documenting functions, types, and so on. 3. Kommentare mit drei Schrägstrichen. Diese werden zum Dokumentieren von Funktionen, Typen usw. verwendet. They will appear as text when you hover over something which is decorated with these comments. Sie erscheinen als Text, wenn Sie den Mauszeiger über einem Element positionieren, das mit diesen Kommentaren versehen ist. They also support .NET-style XML comments, which allow you to generate reference documentation, Sie bieten außerdem Unterstützung für XML-Kommentare im .NET-Stil zum Generieren von Referenzdokumentation, and they also allow editors (such as Visual Studio) to extract information from them. und sie ermöglichen das Extrahieren von Informationen über Editoren (z. B. Visual Studio). To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/xml-documentation Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/xml-documentation. Open namespaces using the 'open' keyword. Öffnen Sie Namespaces mit dem Schlüsselwort "open". To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/import-declarations-the-open-keyword Weitere Informationen finden Sie hier: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/import-declarations-the-open-keyword. A module is a grouping of F# code, such as values, types, and function values. Ein Modul ist eine Gruppierung von F#-Code, z. B. Werte, Typen und Funktionswerte. Grouping code in modules helps keep related code together and helps avoid name conflicts in your program. Die Codegruppierung in Modulen ermöglicht das Zusammenfassen von zueinander in Beziehung stehendem Code sowie das Vermeiden von Namenskonflikten in Ihrem Programm. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/modules Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/modules. This is a sample integer. Dies ist ein Beispiel für eine Ganzzahl. This is a sample floating point number. Dies ist ein Beispiel für eine Gleitkommazahl. This computed a new number by some arithmetic. Numeric types are converted using Hier wird mithilfe einer arithmetischen Operation eine neue Zahl berechnet. Numerische Typen werden unter Verwendung der functions 'int', 'double' and so on. Funktionen "int", "double" usw. konvertiert. This is a list of the numbers from 0 to 99. Dies ist eine Liste der Zahlen von 0 bis 99. This is a list of all tuples containing all the numbers from 0 to 99 and their squares. Dies ist eine Liste aller Tupel, die alle Zahlen von 0 bis 99 sowie Ihre Quadratzahlen enthalten. The next line prints a list that includes tuples, using '%A' for generic printing. Die nächste Zeile gibt eine Liste mit Tupeln aus, wobei "%A" für die generische Ausgabe verwendet wird. This is a sample integer with a type annotation Dies ist ein Beispiel für eine ganze Zahl mit einer Typanmerkung. Values in F# are immutable by default. They cannot be changed Werte in F# sind standardmäßig unveränderlich. Sie können im Verlauf in the course of a program's execution unless explicitly marked as mutable. der Ausführung eines Programms nicht geändert werden – es sei denn, sie sind explizit als änderbar gekennzeichnet. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/values/index#why-immutable Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/values/index#why-immutable Binding a value to a name via 'let' makes it immutable. Wenn ein Wert mithilfe von "let" an einen Namen gebunden wird, ist er unveränderlich. The second line of code fails to compile because 'number' is immutable and bound. Die zweite Codezeile kann nicht kompiliert werden, da "number" unveränderlich und gebunden ist. Re-defining 'number' to be a different value is not allowed in F#. "number" darf in F# nicht als ein anderer Wert neu definiert werden. A mutable binding. This is required to be able to mutate the value of 'otherNumber'. Eine veränderliche Bindung. Dies ist erforderlich, damit der Wert von "otherNumber" verändert werden kann. When mutating a value, use '<-' to assign a new value. Wenn Sie einen Wert verändern, weisen Sie mithilfe von "<-" einen neuen Wert zu. You could not use '=' here for this purpose since it is used for equality Sie können '=' hier nicht verwenden, da es für Gleichheit verwendet wird. or other contexts such as 'let' or 'module' oder andere Kontexte wie "let" oder "module" Much of F# programming consists of defining functions that transform input data to produce Bei der F#-Programmierung werden größtenteils Funktionen definiert, die Eingabedaten in hilfreiche useful results. Ergebnisse umwandelt. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/functions/ Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/functions/ You use 'let' to define a function. This one accepts an integer argument and returns an integer. Verwenden Sie "let", um eine Funktion zu definieren. Diese akzeptiert ein Integer-Argument und gibt einen Integer zurück. Parentheses are optional for function arguments, except for when you use an explicit type annotation. Klammern sind für Funktionsargumente optional, außer wenn Sie eine explizite Typanmerkung verwenden. Apply the function, naming the function return result using 'let'. Die Funktion anwenden, und das Rückgabeergebnis der Funktion mithilfe von 'let' benennen. The variable type is inferred from the function return type. Der Variablentyp wird vom Rückgabetyp der Funktion abgeleitet. This line uses '%d' to print the result as an integer. This is type-safe. Diese Zeile verwendet "%d", um das Ergebnis als Integer zu drucken. Dies ist typsicher. If 'result1' were not of type 'int', then the line would fail to compile. Wenn "result1" nicht vom Typ "int" wäre, würde die Kompilierung der Zeile fehlschlagen. When needed, annotate the type of a parameter name using '(argument:type)'. Parentheses are required. Blenden Sie bei Bedarf den Typ eines Parameternamens mithilfe von "(argument:type)" ein. Klammern sind erforderlich. Conditionals use if/then/elid/elif/else. Für Bedingungen wird Folgendes verwendet: if/then/elid/elif/else. Note that F# uses whitespace indentation-aware syntax, similar to languages like Python. Bei der Syntax von F# werden ebenso wie bei Sprachen wie Python leerzeichenbasierte Einzüge beachtet. This line uses '%f' to print the result as a float. As with '%d' above, this is type-safe. Diese Zeile verwendet "%f", um das Ergebnis als float-Eigenschaft zu drucken. Wie auch zuvor bei "%d" ist dies typsicher. Booleans are fundamental data types in F#. Here are some examples of Booleans and conditional logic. Boolesche Werte sind grundlegende Datentypen in F#. Hier finden Sie einige Beispiele für boolesche Werte und Bedingungen. To learn more, see: Weitere Informationen finden Sie unter: and Und Booleans values are 'true' and 'false'. Boolesche Werte sind "true" und "false". Operators on booleans are 'not', '&&' and '||'. Operatoren für boolesche Werte sind "not", "&&" und "||". This line uses '%b'to print a boolean value. This is type-safe. Diese Zeile verwendet "%b" zum Drucken eines booleschen Werts. Dies ist typsicher. Strings are fundamental data types in F#. Here are some examples of Strings and basic String manipulation. Zeichenfolgen sind grundlegende Datentypen in F#. Hier finden Sie einige Beispiele für Zeichenfolgen und Zeichenfolgenmanipulationen. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/strings Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/strings Strings use double quotes. Für Zeichenfolgen werden doppelte Anführungszeichen verwendet. Strings can also use @ to create a verbatim string literal. Mit "@" lassen sich ausführliche Zeichenfolgenliterale erstellen. This will ignore escape characters such as '\', '\n', '\t', etc. Dadurch werden Escapezeichen wie "\", "\n", "\t" usw. ignoriert. String literals can also use triple-quotes. Für Zeichenfolgen können auch dreifache Anführungszeichen verwendet werden. String concatenation is normally done with the '+' operator. Die Verkettung von Zeichenfolgen erfolgt in der Regel mit dem Operator "+". This line uses '%s' to print a string value. This is type-safe. Diese Zeile verwendet "%s" zum Drucken eines Zeichenfolgewerts. Dies ist typsicher. Substrings use the indexer notation. This line extracts the first 7 characters as a substring. Für Teilzeichenfolgen wird die Indexernotation verwendet. Diese Zeile extrahiert die ersten sieben Zeichen als Teilzeichenfolge. Note that like many languages, Strings are zero-indexed in F#. Im Gegensatz zu den meisten anderen Sprachen sind Zeichenfolgen in F# nullindiziert. Tuples are simple combinations of data values into a combined value. Tupel sind einfache Datenwertkombinationen. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/tuples Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/tuples A simple tuple of integers. Ein einfaches Tupel aus Integerwerten. A function that swaps the order of two values in a tuple. Eine Funktion, die die Reihenfolge von zwei Werten in einem Tupel austauscht. F# Type Inference will automatically generalize the function to have a generic type, Der F#-Typrückschluss generalisiert die Funktion automatisch und erstellt einen generischen Typ, meaning that it will work with any type. d. h. er funktioniert mit jedem Typ. A tuple consisting of an integer, a string, Ein Tupel aus einem Integer, einer Zeichenfolge and a double-precision floating point number. und einer Gleitkommazahl mit doppelter Genauigkeit. A simple tuple of integers with a type annotation. Ein einfaches Tupel aus Integerwerten mit einer Typanmerkung. Type annotations for tuples use the * symbol to separate elements Typanmerkungen für Tupel trennen Elemente durch das *-Symbol. Tuples are normally objects, but they can also be represented as structs. Tupel sind normalerweise Objekte, sie können aber auch als Strukturen dargestellt werden. These interoperate completely with structs in C# and Visual Basic.NET; however, Sie arbeiten mit Strukturen in C# und Visual Basic.Net vollständig zusammen. struct tuples are not implicitly convertable with object tuples (often called reference tuples). Strukturtupel sind jedoch nicht implizit mit Objekttupeln (häufig als Referenztupel bezeichnet) konvertierbar. The second line below will fail to compile because of this. Uncomment it to see what happens. Die unten angezeigte zweite Zeile kann aus diesem Grund nicht kompiliert werden. Heben Sie die Auskommentierung auf, und sehen Sie, was passiert. Although you cannot implicitly convert between struct tuples and reference tuples, Sie können zwar nicht implizit zwischen Strukturtupeln und Verweistupeln konvertieren, you can explicitly convert via pattern matching, as demonstrated below. Sie können aber wie unten gezeigt eine explizite Konvertierung über den Musterabgleich durchführen. The F# pipe operators ('|>', '<|', etc.) and F# composition operators ('>>', '<<') Die F#-PipeOperatoren ("|>", "<|" usw.) und die F#-Zusammensetzungsoperatoren (">>", "<<") are used extensively when processing data. These operators are themselves functions werden bei der Datenverarbeitung umfassend eingesetzt. Diese Operatoren sind Funktionen, which make use of Partial Application. die die partielle Anwendung nutzen. To learn more about these operators, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/functions/#function-composition-and-pipelining Weitere Informationen zu diesen Operatoren finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/functions/#function-composition-and-pipelining To learn more about Partial Application, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/functions/#partial-application-of-arguments Weitere Informationen zur partiellen Anwendung finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/functions/#partial-application-of-arguments Squares a value. Quadriert einen Wert. Adds 1 to a value. Addiert 1 zu einem Wert hinzu. Tests if an integer value is odd via modulo. Testet mit Modulo, ob ein Integerwert gerade ist. A list of 5 numbers. More on lists later. Eine Liste mit fünf Nummern. Weitere Informationen zu Listen finden Sie später. Given a list of integers, it filters out the even numbers, Aus einer Liste mit Integern werden die geraden Zahlen herausgefiltert, squares the resulting odds, and adds 1 to the squared odds. die sich ergebenden ungeraden Zahlen werden quadratiert, und zu dem Ergebnis wird 1 hinzuaddiert. A shorter way to write 'squareOddValuesAndAddOne' is to nest each Eine kürzere Möglichkeit zum Schreiben von "squareOddValuesAndAddOne" besteht im Verschachteln von jedem sub-result into the function calls themselves. Teilergebnis im Funktionsaufruf selbst. This makes the function much shorter, but it's difficult to see the Dadurch wird die Funktion viel kürzer, order in which the data is processed. die Reihenfolge der Datenverarbeitung ist jedoch schlechter sichtbar. A preferred way to write 'squareOddValuesAndAddOne' is to use F# pipe operators. Eine bevorzugte Möglichkeit zum Schreiben von "squareOddValuesAndAddOne" besteht in der Verwendung von F#-Pipe-Operatoren. This allows you to avoid creating intermediate results, but is much more readable Dadurch können Sie verhindern, dass Zwischenergebnisse erstellt werden, dies ist jedoch besser lesbar than nesting function calls like 'squareOddValuesAndAddOneNested' als verschachtelte Funktionsaufrufe wie "squareOddValuesAndAddOneNested". You can shorten 'squareOddValuesAndAddOnePipeline' by moving the second `List.map` call Sie können "squareOddValuesAndAddOnePipeline" kürzen, indem Sie den zweiten "List.map"-Aufruf into the first, using a Lambda Function. mithilfe einer Lambda-Funktion in den ersten verschieben. Note that pipelines are also being used inside the lambda function. F# pipe operators Pipelines werden auch innerhalb der Lambda-Funktion verwendet. F#-Pipe-Operatoren can be used for single values as well. This makes them very powerful for processing data. können auch für einzelne Werte verwendet werden. So ist eine leistungsstarke Datenverarbeitung möglich. Lastly, you can eliminate the need to explicitly take 'values' in as a parameter by using '>>' Es ist nicht mehr erforderlich, "values" als Parameter aufzunehmen, indem Sie mithilfe von ">>" to compose the two core operations: filtering out even numbers, then squaring and adding one. die beiden zentralen Vorgänge erstellen: Herausfiltern von geraden Zahlen, Quadratieren und Addieren von 1. Likewise, the 'fun x -> ...' bit of the lambda expression is also not needed, because 'x' is simply Der Teil "fun x -> ..." des Lambdaausdrucks ist dementsprechend ebenfalls nicht erforderlich, da "x" lediglich being defined in that scope so that it can be passed to a functional pipeline. Thus, '>>' can be used in dem Bereich definiert wird, damit es an eine Funktionspipeline übergeben werden kann. Daher kann ">>" there as well. dort ebenfalls verwendet werden. The result of 'squareOddValuesAndAddOneComposition' is itself another function which takes a Das Ergebnis von "squareOddValuesAndAddOneComposition" selbst ist eine andere Funktion, die eine list of integers as its input. If you execute 'squareOddValuesAndAddOneComposition' with a list Liste von Integern als Eingabe verwendet. Wenn Sie "squareOddValuesAndAddOneComposition" mit einer Liste of integers, you'll notice that it produces the same results as previous functions. von Integern ausführen, erhalten Sie das gleiche Ergebnis wie bei vorherigen Funktionen. This is using what is known as function composition. This is possible because functions in F# Dabei wird die so genannte Funktionskomposition verwendet. Das ist möglich, da Funktionen in F# use Partial Application and the input and output types of each data processing operation match die partielle Anwendung nutzen, und die Ein- und Ausgabetypen jedes Datenverarbeitungsvorgangs the signatures of the functions we're using. mit den Signaturen der verwendeten Funktionen übereinstimmen. Lists are ordered, immutable, singly-linked lists. They are eager in their evaluation. Listen sind geordnete, unveränderliche, einfach verknüpfte Listen. Ihre Auswertung ist streng. This module shows various ways to generate lists and process lists with some functions Dieses Modul zeigt verschiedene Möglichkeiten zum Erstellen von Listen und Prozesslisten mit einigen Funktionen in the 'List' module in the F# Core Library. im Modul "List" in der F#-Kernbibliothek. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/lists Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/lists Lists are defined using [ ... ]. This is an empty list. Listen werden mithilfe von "[ ... ]" definiert. Dies ist eine leere Liste. This is a list with 3 elements. ';' is used to separate elements on the same line. Dies ist eine Liste mit drei Elementen. ";" dient dazu, Elemente in der gleichen Zeile zu trennen. You can also separate elements by placing them on their own lines. Sie können Elemente auch trennen, indem Sie sie in separaten Zeilen einfügen. This is a list of integers from 1 to 1000 Dies ist eine Liste mit ganzen Zahlen von 1 bis 1000. Lists can also be generated by computations. This is a list containing Listen können auch mithilfe von Berechnungen generiert werden. Dies ist eine Liste mit all the days of the year. allen Tagen des Jahres. Print the first 5 elements of 'daysList' using 'List.take'. Drucken Sie mithilfe von "List.take" die ersten fünf Elemente in "daysList". Computations can include conditionals. This is a list containing the tuples Berechnungen können Bedingungen enthalten. Dies ist eine Liste mit den Tupeln, which are the coordinates of the black squares on a chess board. bei denen es sich um die Koordinaten der schwarzen Felder auf einem Schachbrett handelt. Lists can be transformed using 'List.map' and other functional programming combinators. Listen können mithilfe von "List.map" und anderen funktionalen Programmierkombinatoren umgewandelt werden. This definition produces a new list by squaring the numbers in numberList, using the pipeline Diese Definition erzeugt eine neue Liste, indem die Zahlen in "numberList" quadriert werden. Dabei wird der Pipeline- operator to pass an argument to List.map. Operator verwendet, um ein Argument an "List.map" zu übergeben. There are many other list combinations. The following computes the sum of the squares of the Es stehen noch viele andere Listenkombinationen zur Verfügung. Mit dem Folgenden wird die Summe der Quadrate der numbers divisible by 3. durch 3 teilbaren Zahlen berechnet. Arrays are fixed-size, mutable collections of elements of the same type. Arrays sind veränderliche Sammlungen fester Größe, die Elemente des gleichen Typs enthalten. Although they are similar to Lists (they support enumeration and have similar combinators for data processing), Sie ähneln Listen (sie unterstützen Enumeration und haben ähnliche Combinators für die Datenverarbeitung), they are generally faster and support fast random access. This comes at the cost of being less safe by being mutable. sind im Allgemeinen jedoch schneller und unterstützen einen schnellen wahlfreien Zugriff. Dafür sind sie jedoch weniger sicher, da sie veränderlich sind. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/arrays Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/arrays This is The empty array. Note that the syntax is similar to that of Lists, but uses `[| ... |]` instead. Dies ist das leere Array. Die Syntax ähnelt der von Listen, verwendet jedoch stattdessen "[| ... |]". Arrays are specified using the same range of constructs as lists. Arrays werden mithilfe der gleichen Konstrukte angegeben wie Listen. This is an array of numbers from 1 to 1000. Dies ist ein Array mit Zahlen von 1 bis 1000. This is an array containing only the words "hello" and "world". Dieses Array enthält nur die Wörter "hello" und "world". This is an array initialized by index and containing the even numbers from 0 to 2000. Dieses Array wurde per Index initialisiert und enthält gerade Zahlen von 0 bis 2000. Sub-arrays are extracted using slicing notation. Teilarrays werden mithilfe der Segmentnotation extrahiert. You can loop over arrays and lists using 'for' loops. Mit For-Schleifen können Sie bei Arrays und Listen Schleifen ausführen. You can modify the contents of an an array element by using the left arrow assignment operator. Sie können die Inhalte eines Arrayelements mithilfe des Zuweisungsoperators "Pfeil nach links" ändern. To learn more about this operator, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/values/index#mutable-variables Weitere Informationen zu diesem Operator finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/values/index#mutable-variables You can transform arrays using 'Array.map' and other functional programming operations. Sie können Arrays mithilfe von "Array.map" und anderen funktionalen Programmiervorgängen umwandeln. The following calculates the sum of the lengths of the words that start with 'h'. Mit Folgendem wird die Summe der Längen von Wörtern berechnet, die mit "h" beginnen. Sequences are a logical series of elements, all of the same type. These are a more general type than Lists and Arrays. Sequenzen sind logische Serien von Elementen, die alle vom gleichen Typ sind. Ihr Typ ist allgemeiner als Listen und Arrays. Sequences are evaluated on-demand and are re-evaluated each time they are iterated. Sequenzen werden bei Bedarf ausgewertet und bei jeder Iteration erneut ausgewertet. An F# sequence is an alias for a .NET System.Collections.Generic.IEnumerable<'T>. Eine F#-Sequenz ist ein Alias für .NET System.Collections.Generic.IEnumerable<'T>. Sequence processing functions can be applied to Lists and Arrays as well. Funktionen mit Sequenzverarbeitung können auch auf Listen und Arrays angewendet werden. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/sequences Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/sequences This is the empty sequence. Dies ist die leere Sequenz. This a sequence of values. Dies ist eine Sequenz mit Werten. This is an on-demand sequence from 1 to 1000. Dies ist eine bedarfsbasierte Sequenz von 1 bis 1000. This is a sequence producing the words "hello" and "world" Diese Sequenz generiert die Wörter "hello" und "world". This sequence producing the even numbers up to 2000. Diese Sequenz erzeugt gerade Zahlen bis 2000. This is an infinite sequence which is a random walk. Dies ist eine unendliche Sequenz und ermöglicht Zufallsdurchläufe. This example uses yield! to return each element of a subsequence. In diesem Beispiel werden mithilfe von "yield!" die einzelnen Elemente einer Untersequenz zurückgegeben. This example shows the first 100 elements of the random walk. Dieses Beispiel zeigt die ersten 100 Elemente des Zufallsdurchlaufs. Recursive functions can call themselves. In F#, functions are only recursive Rekursive Funktionen können sich selbst aufrufen. In F# sind Funktionen nur rekursiv, when declared using 'let rec'. für die Deklaration mithilfe von "let rec". Recursion is the preferred way to process sequences or collections in F#. Rekursion ist die bevorzugte Möglichkeit zum Verarbeiten von Sequenzen oder Sammlungen in F#. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/functions/index#recursive-functions Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/functions/index#recursive-functions This example shows a recursive function that computes the factorial of an Dieses Beispiel zeigt eine rekursive Funktion, die die Fakultät einer ganzen integer. It uses 'let rec' to define a recursive function. Zahl berechnet. Zum Definieren einer rekursiven Funktion wird "let rec" verwendet. Computes the greatest common factor of two integers. Berechnet den höchsten gemeinsamen Faktor von zwei Integern. Since all of the recursive calls are tail calls, Da alle rekursiven Aufrufe Endeaufrufe sind, the compiler will turn the function into a loop, wandelt der Compiler die Funktion in eine Schleife um, which improves performance and reduces memory consumption. was die Leistung verbessert und die Arbeitsspeicherbedarf reduziert. This example computes the sum of a list of integers using recursion. Dieses Beispiel berechnet mithilfe von Rekursion die Summe einer Liste von Integern. This makes 'sumList' tail recursive, using a helper function with a result accumulator. Mithilfe einer Hilfsfunktion mit einem Ergebnisakkumulator wird "sumList" endrekursiv. This invokes the tail recursive helper function, providing '0' as a seed accumulator. Dies ruft die endrekursive Hilfsfunktion auf und verwendet "0" als Startwertakkumulator. An approach like this is common in F#. Dies ist eine häufige Vorgehensweise in F#. Records are an aggregate of named values, with optional members (such as methods). Datensätze sind ein Aggregat aus benannten Werten mit optionalen Membern (wie etwa Methoden). They are immutable and have structural equality semantics. Sie sind nicht veränderlich und verfügen über eine strukturelle Gleichheitssemantik. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/records Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/records This example shows how to define a new record type. Dieses Beispiel zeigt, wie ein neuer Datensatztyp definiert wird. This example shows how to instantiate a record type. In diesem Beispiel erfahren Sie, wie Sie einen Datensatztyp instanziieren. You can also do this on the same line with ';' separators. Das ist in der gleichen Zeile auch mit dem Trennzeichen ";" möglich. This example shows how to use "copy-and-update" on record values. It creates Dieses Beispiel zeigt die Verwendung von "Kopieren und aktualisieren" für Datensatzwerte. Es wird a new record value that is a copy of contact1, but has different values for ein neuer Datensatz als Kopie von "contact1" erstellt, der jedoch über andere Werte the 'Phone' and 'Verified' fields. für die Felder "Phone" und "Verified" verfügt. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/copy-and-update-record-expressions Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/copy-and-update-record-expressions This example shows how to write a function that processes a record value. Dieses Beispiel veranschaulicht das Schreiben einer Funktion zum Verarbeiten eines Datensatzwerts. It converts a 'ContactCard' object to a string. Es konvertiert ein Objekt vom Typ "ContactCard" in eine Zeichenfolge. This is an example of a Record with a member. Dies ist ein Beispiel für einen Datensatz mit einem Member. Members can implement object-oriented members. Member können objektorientierte Member implementieren. Members are accessed via the '.' operator on an instantiated type. Auf Member wird über den Operator "." in einem instanziierten Typ zugegriffen. Records can also be represented as structs via the 'Struct' attribute. Datensätze können mithilfe des Attributs "Struct" auch als Strukturen dargestellt werden. This is helpful in situations where the performance of structs outweighs Dies ist in Situationen hilfreich, in denen die Leistung der Strukturen wichtiger ist als the flexibility of reference types. die Flexibilität der Verweistypen. Discriminated Unions (DU for short) are values which could be a number of named forms or cases. Diskriminierte Unions (DUs) sind Werte, die eine Anzahl benannter Formen oder Fälle sein können. Data stored in DUs can be one of several distinct values. In DUs gespeicherte Daten können einer von verschiedenen eindeutigen Werten sein. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/discriminated-unions Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/discriminated-unions The following represents the suit of a playing card. Folgendes stellt die Farbe einer Spielkarte dar. A Disciminated Union can also be used to represent the rank of a playing card. Eine diskriminierte Union kann auch verwendet werden, um den Rang einer Spielkarte darzustellen. Represents the rank of cards 2 .. 10 Stellt den Rang der Karten 2 bis 10 dar 10 Discriminated Unions can also implement object-oriented members. Diskriminierte Unions können objektorientierte Member implementieren. This is a record type that combines a Suit and a Rank. Dieser Datensatztyp kombiniert eine Farbe und einen Rang. It's common to use both Records and Disciminated Unions when representing data. Beim Darstellen von Daten werden häufig sowohl Datensätze als auch diskriminierte Unions verwendet. This computes a list representing all the cards in the deck. Dies berechnet eine Liste mit allen Karten im Stapel. This example converts a 'Card' object to a string. Dieses Beispiel konvertiert ein Objekt vom Typ "Card" in eine Zeichenfolge. This example prints all the cards in a playing deck. Dieses Beispiel gibt alle Karten in einem Kartenstapel aus. Single-case DUs are often used for domain modeling. This can buy you extra type safety Einzelfall-DUs werden häufig für die Domänenmodellierung verwendet. Dadurch erhalten Sie zusätzliche Typsicherheit over primitive types such as strings and ints. für primitive Typen wie Zeichenfolgen und Integer. Single-case DUs cannot be implicitly converted to or from the type they wrap. Eine implizite Konvertierung von Einzelfall-DUs in den umschlossenen Typ oder aus diesem Typ ist nicht möglich. For example, a function which takes in an Address cannot accept a string as that input, Beispielsweise eine Funktion, die eine Adresse akzeptiert, kann keine Zeichenfolge als Eingabe akzeptieren or vive/versa. (oder umgekehrt). You can easily instantiate a single-case DU as follows. Sie können Einzelfall-DUs folgendermaßen instanziieren. When you need the value, you can unwrap the underlying value with a simple function. Wenn Sie den Wert benötigen, können Sie den zugrunde liegenden Wert mit einer einfachen Funktion entpacken. Printing single-case DUs is simple with unwrapping functions. Mit entpackten Funktionen lassen sich Einzelfall-DUs einfach drucken. Disciminated Unions also support recursive definitions. Diskriminierte Unions unterstützen auch rekursive Definitionen. This represents a Binary Search Tree, with one case being the Empty tree, Dies stellt eine Struktur für die Binärsuche dar, wobei ein Fall eine leere Struktur ist and the other being a Node with a value and two subtrees. und der andere Fall einen Knoten mit einem Wert und zwei Unterstrukturen darstellt. Check if an item exists in the binary search tree. Prüfen Sie, ob die Struktur für die Binärsuche ein Element enthält. Searches recursively using Pattern Matching. Returns true if it exists; otherwise, false. Sucht rekursiv mithilfe des Musterabgleichs. Gibt bei vorhandenem Element "true" aus, andernfalls "false". Check the left subtree. Prüfen Sie die linke Unterstruktur. Check the right subtree. Prüfen Sie die rechte Unterstruktur. Inserts an item in the Binary Search Tree. Fügt in die Struktur für die Binärsuche ein Element ein. Finds the place to insert recursively using Pattern Matching, then inserts a new node. Findet die Position für das rekursive Einfügen mithilfe des Musterabgleichs und fügt anschließend einen neuen Knoten ein. If the item is already present, it does not insert anything. Wenn das Element bereits vorhanden ist, wird nichts eingefügt. No need to insert, it already exists; return the node. Einfügen nicht erforderlich, da bereits vorhanden; Knoten zurückgeben. Call into left subtree. Aufruf in linker Unterstruktur. Call into right subtree. Aufruf in rechter Unterstruktur. Discriminated Unions can also be represented as structs via the 'Struct' attribute. Diskriminierte Unions können mithilfe des Attributs "Struct" auch als Struktur dargestellt werden. This is helpful in situations where the performance of structs outweighs Dies ist in Situationen hilfreich, in denen die Leistung der Strukturen wichtiger ist als the flexibility of reference types. die Flexibilität der Verweistypen. However, there are two important things to know when doing this: Dabei sind jedoch zwei Punkte zu beachten: 1. A struct DU cannot be recursively-defined. 1. Eine Struktur-DU kann nicht rekursiv definiert werden. 2. A struct DU must have unique names for each of its cases. 2. In einer Struktur-DU muss jeder Fall einen eindeutigen Namen haben. Pattern Matching is a feature of F# that allows you to utilize Patterns, Der Musterabgleich ist eine Funktion von F#, die Ihnen die Verwendung von Mustern ermöglicht, which are a way to compare data with a logical structure or structures, die eine Möglichkeit sind, um Daten mit logischen Strukturen oder Strukturen zu vergleichen, decompose data into constituent parts, or extract information from data in various ways. Daten in ihre Einzelteile zu zerlegen oder auf verschiedene Weise Informationen aus Daten zu extrahieren. You can then dispatch on the "shape" of a pattern via Pattern Matching. Das Verteilen ist anschließend mithilfe des Musterabgleichs anhand der Form eines Musters möglich. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/pattern-matching Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/pattern-matching A record for a person's first and last name Ein Datensatz für den Vor- und Nachnamen einer Person A Discriminated Union of 3 different kinds of employees Eine diskriminierte Union mit drei verschiedenen Arten von Mitarbeitern Count everyone underneath the employee in the management hierarchy, Zählen Sie alle Personen unterhalb des Angestellten in der Verwaltungshierarchie, including the employee. einschließlich des Angestellten. Find all managers/executives named "Dave" who do not have any reports. Suchen Sie alle Manager/Führungskräfte mit dem Namen "Dave", die über keine Berichte verfügen. This uses the 'function' shorthand to as a lambda expression. Dies verwendet die Kurzform "function" als Lambdaausdruck. [] matches an empty list. [] entspricht einer leeren Liste. '_' is a wildcard pattern that matches anything. "_" ist ein Platzhaltermuster, das mit allem übereinstimmt This handles the "or else" case. Dies behandelt den "or else"-Fall. You can also use the shorthand function construct for pattern matching, Sie können das Kurzform-Funktionskonstrukt auch für den Musterabgleich verwenden, which is useful when you're writing functions which make use of Partial Application. was beim Schreiben von Funktionen, die die partielle Anwendung nutzen, hilfreich ist. Define some more functions which parse with the helper function. Definieren Sie weitere Funktionen, die eine Analyse mithilfe der Hilfsfunktion durchführen. Active Patterns are another powerful construct to use with pattern matching. Aktive Muster sind ein weiteres leistungsstarkes Konstrukt, das beim Musterabgleich verwendet werden kann. They allow you to partition input data into custom forms, decomposing them at the pattern match call site. Sie ermöglichen eine Partitionierung der Eingabedaten in benutzerdefinierte Formen, wobei sie an der Musterabgleichs-Aufrufsite zerlegt werden. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/active-patterns Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/active-patterns Pattern Matching via 'function' keyword and Active Patterns often looks like this. Der Musterabgleich mithilfe des Schlüsselworts "function" und das aktive Muster sehen häufig wie folgt aus. Call the printer with some different values to parse. Rufen Sie den Drucker mit unterschiedlichen zu analysierenden Werten auf. Option values are any kind of value tagged with either 'Some' or 'None'. Bei Optionswerten handelt es sich um eine beliebige Art von Werten, die entweder mit 'Some' oder mit 'None' markiert sind. They are used extensively in F# code to represent the cases where many other Sie werden in F#-Code umfassend verwendet, um die Fälle darzustellen, in denen viele languages would use null references. Sprachen NULL-Verweise verwenden würden. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/options Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/options First, define a zipcode defined via Single-case Discriminated Union. Definieren Sie als Erstes eine Postleitzahl, die über eine diskriminierte Einzelfall-Union definiert ist. Next, define a type where the ZipCode is optional. Definieren Sie als Nächstes einen Typ, bei dem "ZipCode" optional ist. Next, define an interface type that represents an object to compute the shipping zone for the customer's zip code, Definieren Sie dann einen Schnittstellentyp, der ein Objekt zum Berechnen der Versandkosten für die Postleitzahl des Kunden repräsentiert, given implementations for the 'getState' and 'getShippingZone' abstract methods. sofern Implementierungen für die abstrakten Methoden "getState" und "getShippingZone" vorhanden sind. Next, calculate a shipping zone for a customer using a calculator instance. Berechnen Sie nun mithilfe einer Rechnerinstanz die Versandkosten für einen Kunden. This uses combinators in the Option module to allow a functional pipeline for Dies verwendet Kombinatoren im Option-Modul für eine funktionale Pipeline zum transforming data with Optionals. Transformieren von Daten mit Optionen. Units of measure are a way to annotate primitive numeric types in a type-safe way. Maßeinheiten sind eine Möglichkeit, um für primitive numerische Typen typsicher den Änderungsverlauf einzublenden. You can then perform type-safe arithmetic on these values. Anschließend können Sie für diese Werte die typsichere Arithmetik ausführen. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/units-of-measure Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/units-of-measure First, open a collection of common unit names Öffnen Sie zunächst eine Auflistung mit allgemeinen Einheitennamen. Define a unitized constant Definieren Sie eine einheitliche Konstante. Next, define a new unit type Definieren Sie als Nächstes einen neuen Einheitentyp. Conversion factor mile to meter. Faktor für die Umrechnung von Meilen in Meter. Define a unitized constant Definieren Sie eine einheitliche Konstante. Compute metric-system constant Berechnen Sie die Konstante für das metrische System. Values using Units of Measure can be used just like the primitive numeric type for things like printing. Werte, die Maßeinheiten verwenden, können wie der primitive numerische Typ z. B. zum Drucken genutzt werden. Classes are a way of defining new object types in F#, and support standard Object-oriented constructs. Klassen sind eine Möglichkeit zum Definieren neuer Objekttypen in F#. Sie unterstützen standardmäßige objektorientierte Konstrukte. They can have a variety of members (methods, properties, events, etc.) Sie können über verschiedene Member verfügen (Methoden, Eigenschaften, Ereignisse usw.) To learn more about Classes, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/classes Weitere Informationen zu Klassen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/classes To learn more about Members, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/members Weitere Informationen zu Membern finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/members A simple two-dimensional Vector class. Eine einfache, zweidimensionale Vektorklasse. The class's constructor is on the first line, Der Konstruktor der Klasse befindet sich in der ersten Zeile and takes two arguments: dx and dy, both of type 'double'. und akzeptiert zwei Argumente: dx und dy, beide vom Typ "double". This internal field stores the length of the vector, computed when the Dieses interne Feld speichert die Länge des Vektors, die berechnet wird, wenn object is constructed das Objekt konstruiert wird. 'this' specifies a name for the object's self identifier. 'this' gibt einen Namen für den Selbstbezeichner des Objekts an. In instance methods, it must appear before the member name. In Instanzmethoden muss dies vor dem Membernamen angegeben werden. This member is a method. The previous members were properties. Dieser Member ist eine Methode. Die vorherigen Member waren Eigenschaften. This is how you instantiate the Vector2D class. So instanziieren Sie die Vector2D-Klasse. Get a new scaled vector object, without modifying the original object. Rufen Sie ein neues skaliertes Vektorobjekt ab, ohne das ursprüngliche Objekt zu verändern. Generic classes allow types to be defined with respect to a set of type parameters. Generische Klassen ermöglichen das Definieren von Typen in Bezug auf eine Gruppe von Typparametern. In the following, 'T is the type parameter for the class. Im Folgenden ist 'T der Typparameter für die Klasse. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/generics/ Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/generics/ This internal field store the states in a list. Dieses interne Feld speichert die Zustände in einer Liste. Add a new element to the list of states. Der Liste der Zustände ein neues Element hinzufügen use the '<-' operator to mutate the value. Den '<-'-Operator verwenden, um den Wert zu mutieren Get the entire list of historical states. Die gesamte Liste der Verlaufszustände abrufen Get the latest state. Den aktuellen Zustand abrufen An 'int' instance of the state tracker class. Note that the type parameter is inferred. Eine 'int'-Instanz der 'state tracker'-Klasse. Beachten Sie, dass der Typ-Parameter abgeleitet wird. Add a state Einen Zustand hinzufügen Interfaces are object types with only 'abstract' members. Schnittstellen sind Objekttypen, die nur über abstrakte Member verfügen. Object types and object expressions can implement interfaces. Objekttypen und Objektausdrücke können Schnittstellen implementieren. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/interfaces Weitere Informationen finden Sie unter:: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/interfaces This is a type that implements IDisposable. Dieser Typ implementiert "IDisposable". This is the implementation of IDisposable members. Dies ist die Implementierung von IDisposable-Membern. This is an object that implements IDisposable via an Object Expression Dies ist ein Objekt, das IDisposable über einen Objektausdruck implementiert. Unlike other languages such as C# or Java, a new type definition is not needed Im Gegensatz zu anderen Sprachen wie C# oder Java ist keine neue Typendefinition erforderlich, to implement an interface. um eine Schnittstelle zu implementieren. The FSharp.Core library defines a range of parallel processing functions. Here Die Bibliothek "FSharp.Core" definiert eine Reihe paralleler Verarbeitungsfunktionen. Hier you use some functions for parallel processing over arrays. verwenden Sie einige Funktionen zur parallelen Verarbeitung über Arrays. To learn more, see: https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/array.parallel-module-%5Bfsharp%5D Weitere Informationen finden Sie unter: https://msdn.microsoft.com/de-de/visualfsharpdocs/conceptual/array.parallel-module-%5Bfsharp%5D First, an array of inputs. Definieren Sie zunächst ein Array mit Eingaben. Next, define a functions that does some CPU intensive computation. Definieren Sie dann eine Funktion mit CPU-intensiven Berechnungen. Next, do a parallel map over a large input array. Führen Sie als Nächstes eine parallele Zuordnung für ein umfangreiches Eingabearray durch. Next, print the results. Geben Sie die Ergebnisse aus. Events are a common idiom for .NET programming, especially with WinForms or WPF applications. Ereignisse sind ein gängiger Begriff bei der .NET-Programmierung, v. a. bei WinForms oder WPF-Anwendungen. To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/members/events Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/members/events First, create instance of Event object that consists of subscription point (event.Publish) and event trigger (event.Trigger). Erstellen Sie zunächst eine Instanz des Event-Objekts mit Abonnementpunkt (event.Publish) und Ereignisauslöser (event.Trigger). Next, add handler to the event. Fügen Sie dem Ereignis einen Handler hinzu. Next, trigger the event. Lösen Sie das Ereignis aus. Next, create an instance of Event that follows standard .NET convention: (sender, EventArgs). Erstellen Sie als Nächstes eine Event-Instanz gemäß der .NET-Standardkonvention: (sender, EventArgs) Next, add a handler for this new event. Fügen Sie einen Handler für das neue Ereignis hinzu. Next, trigger this event (note that sender argument should be set). Lösen Sie das Ereignis aus. (Hinweis: das sender-Argument muss festgelegt sein.)