Programovanie

14 vynikajúcich dôvodov na použitie F #

F # je silne napísaný programovací jazyk s prvou funkčnosťou, ktorý vám umožní vyriešiť zložité problémy napísaním jednoduchého kódu. F # je založený na ML a je postavený na .NET Framework a ponúka dobrú interoperabilitu, prenosnosť a rýchlosť behu, ako aj „päť C“ - presnosť, pohodlie, správnosť, súbežnosť a úplnosť.

F # bol pôvodne k dispozícii iba pre Windows ako projekt Microsoft Research, ale teraz je to prvotriedny jazyk na mnohých platformách. F # môžete používať na počítačoch Mac a Linux s podporou nástrojov v Xamarin Studio, MonoDevelop, Emacs a ďalších; vo Windows s Visual Studio, Xamarin Studio a Emacs; a na zariadeniach s Androidom a iOS a na webe pomocou HTML5. Okrem programovania na všeobecné účely je F # použiteľný pre kód GPU, veľké dáta, hry a oveľa viac.

Prečo používať F #? Poviem vám 14 dôvodov.

F # je interaktívne

Jednou z výhod F # je, že má interaktívne REPL (čítanie, vyhodnocovanie, tlač, opakovanie), kde si môžete vyskúšať kód, ako je to znázornené na obrázku na obrazovke nižšie. V smere hodinových ručičiek zľava hore vidíme interaktívne okná F # z Visual Studio vo Windows, z TryFSharpu bežiaceho v Chrome a z Xamarin Studio bežiaceho na Mac OS X. ;; povie F # Interactive, aby vyhodnotila, čo ste napísali; na TryFSharp tlačidlo „spustiť“ vysiela rovnaký signál. Používanie REPL na kompiláciu a testovanie kódu predtým, ako sa dostane do úplného programu, urýchľuje vývoj a redukuje chyby.

F # je na skriptovanie

F # možno použiť ako skriptovací jazyk aj ako programovací jazyk. Ďalej vidíme ukážku Visual Studio, v ktorej skript F # načíta štyri programové súbory F # a pred vykonaním vlastného kódu otvorí dve knižnice .NET. Zápis [|…|] tu použité deklaruje pole. Zápis |> je predné potrubie, ktoré prenáša výsledok ľavej strany na funkciu na pravej strane. Nové riadky tu nie sú syntakticky významné. Iba uľahčujú čítanie kódu, ako keby mali celé výrazy v jednom riadku.

F # je funkčný

F # podporuje konštrukty funkčného programovania, ako je napríklad zaobchádzanie s funkciami ako s hodnotami, použitie nepomenovaných funkcií vo výrazoch, zloženie funkcií na vytvorenie nových funkcií, curriedované funkcie a implicitná definícia funkcií pomocou čiastočnej aplikácie argumentov funkcií. Na hornom obrázku obrazovky nižšie definujeme a používame znak pridať funkcia. Telo funkcie je odsadené (napríklad Python) a typy argumentov sú z dôvodu odvodené ako celé čísla + operátor. Na spodnej snímke obrazovky dodávame anotáciu typu za názvom argumentu pomocou dvojbodky a názvu typu, takže F # vie, že fráza je a struna typu.

F # je výstižné

Nasledujúci kód je algoritmus podobný Quicksortu implementovaný vo F # (Scott Wlaschin). The rec kľúčové slovo označuje, že funkcia je rekurzívna. The zápas..s syntax je a prepínač vyhlásenie o steroidoch, s | indikujúce prípady. The [] označuje prázdny zoznam. The prvýElem a ďalšie prvky sa vytvárajú automaticky.

Všimnite si, že v kóde nie sú uvedené žiadne vyhlásenia o typoch, čo znamená, že funkcia môže triediť zoznamy obsahujúce akýkoľvek typ, ktorý podporuje operátory porovnania. The zábava kľúčové slovo slúži na definovanie anonymnej funkcie lambda.

nechaj zoznam quicksortu =

zoznam zápasov s

| [] -> // Ak je zoznam prázdny

[] // vráti prázdny zoznam

| firstElem :: otherElements -> // Ak zoznam nie je prázdny

nechajte menšie prvky = // extrahujte menšie

ďalšie prvky

|> List.filter (zábava e -> e <prvýElem)

|> quicksort // a zoradiť ich

nechajte largerElements = // extrahovať veľké

ďalšie prvky

|> List.filter (zábava e -> e> = firstElem)

|> quicksort // a zoradiť ich

// Spojte 3 časti do nového zoznamu a vráťte ich

List.concat [smallerElements; [firstElem]; largerElements]

// test

printfn "% A" (quicksort [1; 5; 23; 18; 9; 1; 3])

Pre porovnanie si pozrite tradičnú implementáciu C # nižšie.

verejná trieda QuickSortHelper

{

verejný statický zoznam QuickSort (hodnoty zoznamu)

kde T: porovnateľné

   {

if (values.Count == 0)

      {

vrátiť nový zoznam ();

      }

// získa prvý prvok

T firstElement = hodnoty [0];

// získa menšie a väčšie prvky

var smallerElements = new List ();

var largerElements = new List ();

for (int i = 1; i <values.Count; i ++) // i začína na 1

{// nie 0!

var elem = hodnoty [i];

if (elem.CompareTo (firstElement) <0)

         {

smallerElements.Add (elem);

         }

inak

         {

largerElements.Add (elem);

         }

      }

// vráti výsledok

var result = new List ();

result.AddRange (QuickSort (smallerElements.ToList ()));

result.Add (firstElement);

result.AddRange (QuickSort (largerElements.ToList ()));

návratový výsledok;

   }

}

Všimnete si, koľko extra krivky má C # kód v porovnaní s F # kódom.

F # je naozaj stručné

Podľa Scotta Wlaschina má verzia quicksortu uvedená nižšie - všetky jeho štyri riadky - typický výstižný vzhľad F # napísaný skúseným funkčným kódovačom. Samozrejme, bol by prvý, kto by poukázal na to, že to nefunguje na danom mieste. Trvalo mi viacnásobné čítanie, kým som pochopil kód, ale stálo to za to.

nech rec quicksort2 = funkcia

   | [] -> []                        

| prvý :: odpočinok ->

nechajte menšie, väčšie = List.partition ((> =) prvý) odpočívať

List.concat [quicksort2 menší; [najprv]; quicksort2 väčšie]

// testovací kód

printfn "% A" (quicksort2 [1; 5; 23; 18; 9; 1; 3])

Stručne povedané, prvý prípad vráti prázdny zoznam, ak bol splnený, pričom poskytuje kritérium ukončenia; druhý prípad rozdelí zoznam na prvý prvok a na zvyšok a priradí zoznam, ktorý začína od menšej hodnoty, po menšie a druhý podzoznam do väčšie. V rámci zreťazenia podnázov funkcia rekurzívne triedi znaky menšie a väčšie zoznamy.

F # redukuje chyby pomocou silného písania

Na rozdiel od JavaScriptu, Ruby a Pythonu je F # silne typovaný, nie dynamicky. Na rozdiel od C a C ++, ktoré sú tiež silne typované, ale vyžadujú deklaráciu všetkých typov, F # vykonáva odvodenie typu, kedykoľvek je to možné. Keď odvodenie typu nie je možné, ale typ je potrebné poznať, kompilátor F # vyhodí chybu a navrhne, aby ste zadali anotáciu typu, ako sme to museli urobiť v staršom príklade pre (fráza: reťazec) argument k toHackerTalk funkcia. Zachytenie nezhody typu v čase kompilácie eliminuje celú triedu chýb za behu, ku ktorým sú náchylné jazyky s dynamickým typom.

Mimochodom, F # nechajme väzby sú nemenné, pokiaľ ich výslovne nevyhlásite premenlivé.

F # má veľkú, dobre vybranú množinu objektov, vrátane List, String a Array

Ako môžete vidieť z nižšie uvedeného IntelliSense, F # má bohaté moduly List, String a Array založené na .NET Framework. V tomto ohľade je to tiež objektovo orientovaný jazyk, aj keď je to predovšetkým funkčný jazyk. Všimnite si, že nezáleží na tom, či použijete názov modulu alebo zadaný názov premennej - keď pridáte bodku, členské funkcie sa vysunú. Niektorí tvrdia, že výslovné použitie názvu modulu je pre funkčný jazyk lepším štýlom ako bodkované premenné, ale tento argument si úplne nekúpim.

F # je užitočné pre MapReduce

MapReduce je efektívny dvojkrokový proces, ktorý sa často používa na veľkých dátach a je výslovne podporovaný v Hadoop. V tomto príklade F # mapujeme a zmenšujeme zoznam celých čísel. Najprv filtrujeme zoznam na párne čísla, potom každé číslo zdvojnásobíme a nakoniec zoberieme súčet všetkých prvkov v zozname, aby sme agregovali alebo zmenšili výsledok. List.map je výkonná funkcia vyššieho rádu; funkcia vyššieho rádu je taká, ktorá berie inú funkciu ako argument. Okrem zoznamov a polí podporuje F # záznamy, sekvencie, poskytovateľov dátových typov a LINQ (dotaz integrovaný do jazyka).

F # má záznamy

Záznamy F # predstavujú jednoduché agregáty pomenovaných hodnôt, voliteľne s členmi. V príklade nižšie najskôr definujeme a Kniha typ záznamu so štyrmi pomenovanými hodnotami a potom vytvoríme záznam s rovnakými štyrmi názvami. Kompilátor F # správne odvodzuje Kniha zadajte zodpovedajúce mená.

Záznamy F # môžu mať voliteľné hodnoty

Záznamy nemusia vždy obsahovať všetky ich pomenované hodnoty. Ak dáte pomenovanú hodnotu, možnosť atribút, keď definujete typ, potom ho možno vynechať zo záznamu. Keď nastavíte voliteľnú hodnotu, môže to byť buď Žiadne, ktorá končí ako a nulový, alebo môže byť Niektoré nasledovaná hodnotou, ktorú chcete nastaviť. Polia záznamu sa líšia od tried tým, že sú automaticky vystavené ako vlastnosti. Triedy a štruktúry v F # sú .NET triedy a štruktúry, kompatibilné s C # a Visual Basic .NET, takže si prídem odpustiť.

F # má sekvencie

Postupnosť vo F # je logická séria prvkov jedného typu. Sekvencie sú obzvlášť užitočné, keď máte veľký a usporiadaný zber údajov, ale nemusíte nevyhnutne očakávať, že použijete všetky prvky. Jednotlivé prvky sekvencie sa počítajú iba podľa potreby, takže sekvencia môže poskytnúť lepší výkon ako zoznam v situáciách, keď sa nepoužívajú všetky prvky. The Sekv modul poskytuje podporu pre manipulácie zahŕňajúce sekvencie. Na obrázku nižšie demonštrujeme jednoduché sekvencie, sekvencie s výrazmi a sekvencie s filtrami.

F # podporuje poskytovateľov údajov a LINQ

Ďalej používame editor TryFSharp na otvorenie online sady údajov o meteorológii Freebase a na vyhľadanie poskytovateľa údajov o cyklónoch, ktoré zaznamenali najvyššie hodnoty vetra. The dopyt { } syntax implementuje LINQ pre F #. Použitie tejto DLL je špecifické pre TryFSharp. V Visual Studio by ste to urobili otvorte Microsoft.FSharp.Data.TypeProviders a potom použite príslušnú službu poskytovateľa údajov.

Výsledok:

 [Hurikán Andrew; Hurikán Hugo; Hurikán Galveston 1900;

Tropická búrka Allison; Cyclone Tracy; Hurikán Iniki; Hurikán Ivan;

1999 cyklón Urísa; Hurikán Katrina; Tajfún Talim; Hurikán Rita;

Tajfúnová bylina; Hurikán Wilma; Tajfún veru; Sezóna tichomorských tajfúnov 1962;

Typhoon Ike; Tajfún Mireille; Tajfún Babe; Tropická búrka Arlene;

Hurikán Irene; Tajfún Zeb; Tajfún Maemi; Tajfún Bess; Tajfún Chanchu;

Typhoon Patsy; Tajfún Ewiniar; Hurikán Ioke; Typhoon Xangsane;…

F # môže analyzovať údaje Hadoop

V tomto príklade používame editor TryFsharp na otvorenie inštancie Hadoop Hive, ktorá obsahuje okrem iných množín údajov aj merania prvkov kvetov dúhovky spolu s anotáciami merných jednotiek. V súlade s tým sme povolili použitie anotácií jednotiek vo vlastnostiach súboru HiveTypeProvider.

Tento výpočet vráti:

val avgPetalLength: float = 0,0374966443

F # robí porovnávanie vzorov

F # zápas výraz poskytuje kontrolu vetvenia, ktorá je založená na porovnaní výrazu so súborom vzorov. Riadky 1 - 7 príkladu nižšie definujú rekurzívne isPalindrome funkcia. Riadky 8-10 definujú funkciu obálky pre isPalindrome ktorý ju volá prvýkrát pomocou celého reťazca. Pretože „aba“ je palindróm, potom doložka o riadku 9 vystrelí a vráti sa Niektoré sa zápas príkaz v riadku 11 vygeneruje „Reťazec aba je palindróm“. The _ vzor v riadku 14 je predvolený prípad.

The zápas .. | vyhlásenie vo F # má v porovnaní s prepínač..prípad vyhlásenie v C #, C ++ a Java, z ktorých najdôležitejšie je, že spôsobuje menej chýb.

F # podporuje asynchrónne pracovné toky

F # má prístup ku všetkým rozhraniam .NET Framework, ale má tiež vlastnú syntax pre asynchrónne pracovné postupy. The async {výraz} syntax definuje neblokujúci výpočet. The urob! kľúčové slovo vykoná asynchrónnu operáciu a čaká na výsledok. The nechaj! kľúčové slovo čaká na asynchrónnu operáciu a priradí výsledok. A použite! čaká na asynchrónnu operáciu, priradí výsledok a uvoľní prostriedok. Async.RunSynchronously vykoná asynchrónnu operáciu a čaká na svoj výsledok. Ak chcete pridať paralelizmus, použite Async.Parallel funkcia, ktorá prevezme zoznam Async objekty, nastaví kód pre každý z nich Async objekt úlohy bežať paralelne a vráti Async objekt, ktorý predstavuje paralelný výpočet. Potom dajte výsledok na Async.RunSynchronously. (Nižšie uvedený príklad pochádza z F # pre zábavu a zisk.)

F # zdroje

Ďalšie informácie o F # nájdete na odkazoch nižšie.

  • Vyskúšajte F #
  • F # pre zábavu a zisk
  • Referencia jazyka F #
  • Funkčné programovanie v reálnom svete
  • F # kníh na Amazone
  • Biela kniha F # 3
  • Ďalšie odkazy
$config[zx-auto] not found$config[zx-overlay] not found