Welche allgemeinen Tipps haben Sie zum Golfen in F #? Ich bin auf der Suche nach Ideen, die sich auf Code-Golf-Probleme im Allgemeinen anwenden lassen, die zumindest etwas spezifisch für F # sind (z. B. "Kommentare entfernen" ist keine Antwort). Bitte posten Sie einen Tipp pro Antwort.
21
Tupel-Dekonstruktion
Wenn Sie nicht mit Variablen umgehen können, verwenden Sie die Tupel-Dekonstruktion anstelle mehrerer let-Ausdrücke
anstatt
Lesen von stdin
Die F # -Kernbibliothek definiert einen Alias für die
System.Console.In
aufgerufenenstdin
. Mit diesen können Sie Eingaben lesen.TextReader auf msdn
Abgesehen von dem großen Vorteil, dass es kürzer als
Console
ist, müssen Sie System auch nicht öffnenÜber einen String iterieren
Zeichenfolge ist im Grunde genommen eine Zeichenfolge
char seq
, mit der SieSeq.map
direkt Zeichenfolgen verwenden können. Es ist auch möglich, sie in Begriffen zu verwenden[for c in "" do]
Mutables / Referenzzellen
Die Verwendung von Referenzzellen ist nicht immer kürzer, da jeder Lesevorgang ein zusätzliches Zeichen enthält, um die Zelle deref zu machen.
Allgemeine Hinweise
Es ist möglich, die komplette
match .. with
Inline zu schreibenLeerzeichen vor und nach nicht alphanumerischen Zeichen sind nicht erforderlich.
Wenn Sie eine Zeichenfolge mit Leerzeichen links oder rechts auffüllen müssen, können Sie dafür die Flags [s] printf [n] verwenden.
Core.Printf-Modul
quelle
Verwenden Sie id anstelle von x-> x
id ist ein Operator, der für die Identitätsfunktion steht.
kann geschrieben werden
Quelle
Ich benutze es hier
quelle
Eta-Konvertierung für Funktionen
Vielen Dank an Laikoni für diesen Tipp in einer meiner Lösungen .
Stellen Sie sich eine Funktion vor, um beispielsweise eine Zeichenfolge mit 3 für Großbuchstaben und 1 für alle anderen Zeichen zu summieren. So:
Durch Eta-Konvertierung kann dies wie folgt umgeschrieben werden:
und wie zuvor angerufen:
Die Funktion zum Weiterleiten der Komposition
>>
Angenommen, unsere ursprüngliche Herausforderung besteht darin, eine Zeichenfolge mit 3 für Großbuchstaben und 1 für Kleinbuchstaben zu summieren, und alle anderen Zeichen sind ausgeschlossen.
Wir könnten dies schreiben als:
Wir können den Forward-Composition-Operator (
>>
) verwenden, um die beiden Funktionen (Seq.filter
undSeq.sumBy
) miteinander zu verketten. Bei der eta-Konvertierung würde die Funktionsdefinition folgendermaßen aussehen:Chris Smith hat
>>
in seinem MSDN-Blog einen tollen Bericht über den Betreiber verfasst .quelle
Wenn möglich
Seq
ist kürzer alsList
:ist ein char kürzer ...
quelle
Vermeiden Sie Klammern, wenn Sie einen Parameter und ein Tupel verwenden
kann geschrieben werden
quelle
Neue Zeilenfolge vor "\ n" bevorzugen
Dies macht sich bereits bei einem einzelnen neuen Zeilenzeichen in Ihrem Code bezahlt. Ein Anwendungsfall könnte sein:
(18 Bytes)
(17 Bytes)
Inspiriert von Chirus Antwort für es6 .
Gebrauchte hier
quelle
Verwenden Sie .NET
.NET bietet viele nette Builtins. F # kann sie benutzen, also vergiss sie nicht!
Beispiel:
Es kann hilfreich sein!
quelle
Verwenden Sie Lambdas, um ein Byte zu speichern. Zum Beispiel das:
Kann wie folgt ausgedrückt werden:
quelle
Verwenden Sie für ... um statt für ... um einen Bereich zu betreten
quelle
Das
module
Schlüsselwort kann verwendet werden, um Modulnamen bei wiederholter Verwendung zu verkürzen. Beispielsweise:kann werden
Dies ist nützlicher für längere Programme, bei denen Modulmethoden wiederholt verwendet werden (und jedes Mal vollständig benannt werden müssen, weil sie den
RequireQualifiedAccess
Modifikator haben), und ermöglicht das Absparen einiger Zeichen, insbesondere, wenn es nützlicher ist, ein reguläres CLR-Array zu verwenden (z. B. Mutabilität) ) als ein F #seq
oderlist
.quelle