Jakie masz ogólne wskazówki na temat gry w golfa w F #? Szukam pomysłów, które można by zastosować do problemów z golfem w kodzie, które są przynajmniej nieco specyficzne dla F # (np. „Usuń komentarze” nie jest odpowiedzią). Proszę zamieścić jedną wskazówkę na odpowiedź.
21
Dekonstrukcja krotkowa
Jeśli nie możesz przejść do korzystania ze zmiennych, użyj dekonstrukcji krotek zamiast wielu wyrażeń let
zamiast
Czytanie ze standardowego
Biblioteka podstawowa F # definiuje alias dla
System.Console.In
wywoływanejstdin
. Umożliwiają one odczytywanie danych wejściowych.TextReader na msdn
Dużą zaletą jest to, że jest krótszy niż
Console
obecnie, nie trzeba też otwierać SystemuIterowanie po sznurku
string jest w zasadzie a
char seq
, to pozwala ci używaćSeq.map
bezpośrednio z stringami. Można je również wykorzystać w zrozumieniu[for c in "" do]
Zmienne / komórki referencyjne
Korzystanie z komórek referencyjnych nie zawsze jest krótsze, ponieważ każda operacja odczytu wiąże się z dodatkowym znakiem wykreślającym komórkę.
Ogólne wskazówki
Można napisać cały
match .. with
wierszNie ma potrzeby używania białych znaków przed i po znakach nie alfanumerycznych.
W przypadku, gdy chcesz wstawić lewy lub prawy ciąg znaków ze spacjami, możesz użyć do tego flag [s] printf [n].
Moduł Core.Printf
źródło
Użyj id zamiast x-> x
id to operator oznaczający funkcję tożsamości.
można napisać
źródło
Korzystam z tego tutaj
źródło
Eta-konwersja funkcji
Ogromne podziękowania dla Laikoni za tę wskazówkę w jednym z moich rozwiązań .
Rozważ funkcję, powiedzmy, sumowania ciągu 3 dla wielkich liter i 1 dla wszystkich innych znaków. Więc:
Przez eta-konwersję można to zapisać ponownie jako:
i wywoływane w taki sam sposób jak poprzednio:
Funkcja operatora kompozycji do przodu
>>
Załóżmy teraz, że naszym pierwotnym wyzwaniem byłoby zsumowanie ciągu 3 dla wielkich liter i 1 dla małych liter, a wszystkie inne znaki są wykluczone.
Możemy to napisać jako:
Możemy użyć operatora kompozycji do przodu (
>>
), aby połączyć dwie funkcje (Seq.filter
iSeq.sumBy
) razem. W przypadku konwersji eta definicja funkcji wyglądałaby następująco:Chris Smith napisał świetną recenzję dla
>>
operatora na swoim blogu MSDN .źródło
Jeśli
Seq
to możliwe, jest krótszy niżList
:jest o jeden char krótszy ...
źródło
Unikaj nawiasów, gdy używasz jednego parametru i na krotce
można napisać
źródło
Preferuj nowy ciąg wiersza nad „\ n”
Zacznie się to opłacać nawet w jednym nowym znaku wiersza w kodzie. Jednym przypadkiem użycia może być:
(18 bajtów)
(17 bajtów)
Zainspirowany odpowiedzią Chiru na es6 .
Użyto tutaj
źródło
Użyj .NET
.NET oferuje wiele fajnych wbudowanych funkcji. F # może ich używać, więc nie zapomnij o nich!
Przykład:
To może być pomocne!
źródło
Użyj lambdas, aby zapisać bajt. Na przykład:
Można to wyrazić następująco:
źródło
Użyj dla ... aby zamiast dla ... w, aby przejść zasięg
źródło
Słowo
module
kluczowe może być użyte do skrócenia nazw modułów, gdy są używane wielokrotnie. Na przykład:może zostać
Jest to bardziej przydatne w przypadku dłuższych programów, w których metody modułowe są używane wielokrotnie (i muszą być za każdym razem pełne nazwy, ponieważ mają
RequireQualifiedAccess
modyfikator), i pozwala na wyłączenie kilku znaków, szczególnie gdy bardziej użyteczne jest użycie zwykłej tablicy CLR (np. Zmienność ) niż F #seq
lublist
.źródło