Programavimas

14 puikių priežasčių naudoti F #

F # yra griežtai įvesta funkcinė programavimo kalba, leidžianti išspręsti sudėtingas problemas rašant paprastą kodą. Remdamasis ML ir remdamasis .NET Framework, F # siūlo gerą sąveikumą, perkeliamumą ir veikimo laiką, taip pat „Five Cs“ - glaustumą, patogumą, teisingumą, sutapimą ir išsamumą.

Iš pradžių „F #“ buvo prieinama tik „Windows“, kaip „Microsoft Research“ projektą, tačiau dabar tai yra aukščiausios klasės kalba daugelyje platformų. Galite naudoti F # „Mac“ ir „Linux“ su įrankių palaikymu „Xamarin Studio“, „MonoDevelop“, „Emacs“ ir kt. „Windows“ sistemose su „Visual Studio“, „Xamarin Studio“ ir „Emacs“; „Android“ ir „iOS“ įrenginiuose bei žiniatinklyje naudojant HTML5. Be bendrosios paskirties programavimo, F # taikomas GPU kodui, didiesiems duomenims, žaidimams ir daugeliui kitų.

Kodėl naudoti F #? Leiskite pateikti jums 14 priežasčių.

F # yra interaktyvus

Vienas iš „F #“ pranašumų yra tai, kad jis turi interaktyvų REPL (skaityti, vertinti, spausdinti, cikliuoti), kuriame galite išbandyti kodą, kaip parodyta žemiau esančiame ekrano paveikslėlyje. Pagal laikrodžio rodyklę iš viršaus kairėje matome „F # Interactive“ langus iš „Visual Studio“ sistemoje „Windows“, iš „TryFSharp“, veikiančio „Chrome“, ir iš „Xamarin Studio“, veikiančio „Mac OS X“. ;; liepia „F # Interactive“ įvertinti tai, ką įvedėte; ant „TryFSharp“ mygtukas „paleisti“ siunčia tą patį signalą. REPL naudojimas norint sukompiliuoti ir išbandyti kodą, kol jis neįeina į visą programą, pagreitina kūrimą ir sumažina klaidas.

F # skirtas scenarijams

F # gali būti naudojamas kaip scenarijų kalba, taip pat kaip programavimo kalba. Žemiau matome „Visual Studio“ pavyzdį, kuriame F # scenarijus prieš vykdydamas savo kodą įkelia keturis F # programos failus ir atidaro dvi .NET bibliotekas. Žymėjimas [|…|] naudojamas čia deklaruoja masyvą. Žymėjimas |> yra priekinis vamzdis, kuris kairės pusės rezultatą perduoda dešinės pusės funkcijai. Naujos eilutės čia nėra sintaksiškai reikšmingos. Jie tiesiog palengvina kodo skaitymą, nei vienoje eilutėje yra ištisos vamzdžių išraiškos.

F # yra funkcinis

F # palaiko funkcinio programavimo konstrukcijas, tokias kaip funkcijų traktavimas kaip reikšmės, nenurodytų funkcijų naudojimas išraiškose, funkcijų sudėtis naujoms funkcijoms formuoti, curried funkcijos ir numanomas funkcijų apibrėžimas, iš dalies taikant funkcijų argumentus. Žemiau pateiktame viršutiniame ekrano vaizde mes apibrėžiame ir naudojame papildyti funkcija. Funkcijos kūnas yra įtraukiamas (pvz., „Python“), o argumentų tipai yra daromi sveikaisiais skaičiais dėl + operatorius. Apatiniame ekrano vaizde pateikiame tipo anotaciją po argumento pavadinimu naudodami dvitaškį ir tipo pavadinimą, todėl F # žino, kad frazė yra stygos tipo.

F # yra glaustas

Žemiau pateiktas kodas yra į „Quicksort“ panašus algoritmas, įdiegtas F # (Scott Wlaschin). rec raktinis žodis rodo, kad funkcija yra rekursyvi. degtukas..su sintaksė yra a perjungti pareiškimas apie steroidus, su | nurodant atvejus. [] rodo tuščią sąrašą. pirmasisElemas ir kitiElementai yra sukuriami automatiškai.

Atkreipkite dėmesį, kad kodo vietoje nėra paminėta tipo deklaracijų, o tai reiškia, kad funkcija gali rūšiuoti sąrašus, kuriuose yra bet kokio tipo, palaikantys palyginimo operatorius. linksma raktinis žodis skirtas apibrėžti anoniminę lambda funkciją.

tegul rec quicksort sąrašas =

atitikmenų sąrašas su

| [] -> // Jei sąrašas tuščias

[] // grąžinti tuščią sąrašą

| firstElem :: otherElements -> // Jei sąrašas nėra tuščias

tegul mažesniElementai = // išskiria mažesnius

kitiElementai

|> List.filter (linksmas e -> e <firstElemas)

|> quortsort // ir rūšiuoti juos

tegu didesniElementai = // išskiria didelius

kitiElementai

|> List.filter (linksmas e -> e> = firstElem)

|> quortsort // ir rūšiuoti juos

// Sujunkite 3 dalis į naują sąrašą ir grąžinkite jį

List.concat [mažesnėsElementai; [pirmasisElemas]; didesnisElementas]

// testas

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

Palyginimui pažvelkite į toliau pateiktą tradicinį C # diegimą.

viešosios klasės „QuickSortHelper“

{

viešasis statinis sąrašas „QuickSort“ (sąrašo vertės)

kur T: IC nepalyginamas

   {

jei (reikšmės.Skaičius == 0)

      {

grąžinti naują sąrašą ();

      }

// gauti pirmąjį elementą

T firstElement = reikšmės [0];

// gauti mažesnius ir didesnius elementus

var kisebbElementai = naujas sąrašas ();

var didesnisElementas = naujas sąrašas ();

for (int i = 1; i <reikšmės. Skaičius; i ++) // i prasideda nuo 1

{// ne 0!

var elem = reikšmės [i];

jei (elem.CompareTo (firstElement) <0)

         {

mažesniElementai.Add (elem);

         }

Kitas

         {

didesnisElementas.Add (elem);

         }

      }

// grąžinti rezultatą

var rezultatas = naujas sąrašas ();

rezultatas.AddRange („QuickSort“ (mažesniElementai.ToList ()));

rezultatas.Add (firstElement);

rezultatas.AddRange („QuickSort“ (didesniElementai.ToList ()));

grąžinimo rezultatas;

   }

}

Jūs pastebėsite, kiek papildomo greito C # kodas, palyginti su F # kodu.

F # yra tikrai glaustas

Pasak Scotto Wlaschino, žemiau parodyta „quicksort“ versija - visos keturios jos eilutės - turi tipišką glaustą F # išvaizdą, parašytą patyrusio funkcinio kodavimo įrenginio. Žinoma, jis būtų pirmas, kuris pažymi, kad tai nerūšiuoja vietoje. Kad suprasčiau kodą, man reikėjo kelis kartus skaityti, bet tai buvo verta laiko.

tegul rec quicksort2 = funkcija

   | [] -> []                        

| pirmas :: poilsis ->

tegul pailsėja mažesnis, didesnis = List.partition ((> =) pirmiausia)

List.concat [quicksort2 mažesnis; [Pirmas]; quicksort2 didesnis]

// bandymo kodas

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

Trumpai tariant, pirmas atvejis grąžina tuščią sąrašą, jei jį išlaikė, pateikdamas išėjimo kriterijų; antrasis atvejis padalija sąrašą į pirmąjį elementą ir likusius, priskirdamas antrinį sąrašą pradedant mažesne verte mažesnis ir kitas sublistas į didesnis. Sublistų sujungimo metu funkcija rekursyviai rūšiuoja mažesnis ir didesnis sąrašus.

F # sumažina klaidas per tvirtą spausdinimą

Skirtingai nuo „JavaScript“, „Ruby“ ir „Python“, F # yra griežtai, o ne dinamiškai. Skirtingai nuo C ir C ++, kurie taip pat yra labai tipiški, tačiau reikalaujama deklaruoti visus tipus, F # atlieka tipo išvadas, kai tik įmanoma. Kai neįmanoma padaryti išvados apie tipą, tačiau reikia žinoti tipą, kompiliatorius F # sukels klaidą ir pasiūlys pateikti tipo komentarą, kaip turėjome padaryti ankstesniame pavyzdyje (frazė: eilutė) argumentas „HackerTalk“ funkcija. Pagaunant tipų neatitikimą kompiliavimo metu, pašalinama visa vykdymo laiko klaidų klasė, kuriai būdingos dinamiškai įvestos kalbos.

Beje, F # leisti apkaustai yra nekintami, nebent jūs specialiai jų deklaruojate kintamas.

F # turi didelį, gerai parinktą objektų rinkinį, įskaitant sąrašą, eilutę ir masyvą

Kaip matote iš toliau pateiktos „IntelliSense“, F # turi daug „List“, „String“ ir „Array“ modulių, pagrįstų .NET Framework. Šiuo požiūriu ji taip pat yra į objektą orientuota kalba, nors ji pirmiausia yra funkcinė kalba. Atkreipkite dėmesį, kad nesvarbu, ar naudojate modulio pavadinimą, ar įvestą kintamojo pavadinimą - pridėjus tašką, atsiras narių funkcijos. Kai kurie žmonės teigia, kad aiškus modulio pavadinimo naudojimas yra geresnis funkcinės kalbos stilius nei punktyriniai kintamieji, tačiau aš visiškai neperku šio argumento.

F # yra naudingas MapReduce

„MapReduce“ yra efektyvus dviejų pakopų procesas, dažnai naudojamas dideliuose duomenyse ir aiškiai palaikomas „Hadoop“. Šiame F # pavyzdyje mes susiejame ir sumažiname sveikųjų skaičių sąrašą. Pirmiausia filtruojame sąrašą pagal lyginius skaičius, tada padvigubiname kiekvieną skaičių ir galiausiai imame visų sąrašo elementų sumą rezultatui sumuoti arba sumažinti. Sąrašas.map yra galinga aukštesnės eilės funkcija; aukštesnės eilės funkcija yra ta, kuri argumentu laiko kitą funkciją. Be sąrašų ir masyvų, F # palaiko įrašus, sekas, duomenų tipo teikėjus ir LINQ (integruota kalba užklausa).

F # turi įrašų

F # įrašai reiškia paprastus įvardytų reikšmių agregatus, pasirinktinai su nariais. Žemiau pateiktame pavyzdyje pirmiausia apibrėžiame a Knyga įrašo tipas su keturiomis įvardytomis reikšmėmis, tada sukuriame įrašą naudodami tuos pačius keturis pavadinimus. F # kompiliatorius teisingai daro išvadą Knyga įveskite suderindami pavadinimus.

F # įrašai gali turėti neprivalomas reikšmes

Įrašai ne visada turi apimti visas jų įvardytas vertes. Jei nurodysite įvardytą vertę variantą atributas, kai apibrėžiate tipą, tada jį galima palikti iš įrašo. Kai nustatote pasirinktinę vertę, ji gali būti arba Nė vienas, kuris baigiasi kaip niekinisarba gali būti Kai kurie po to - norima nustatyti reikšmė. Įrašų laukai skiriasi nuo klasių tuo, kad jie automatiškai parodomi kaip savybės. F # klasės ir struktūros yra .NET klasės ir struktūros, suderinamos su C # ir Visual Basic .NET, todėl atsisakysiu pavyzdžių.

F # turi sekas

F # seka yra logiška vieno tipo elementų serija. Sekos yra ypač naudingos, kai turite daug užsakytų duomenų, bet nebūtinai tikitės naudoti visus elementus. Atskiri sekos elementai skaičiuojami tik pagal poreikį, todėl seka gali suteikti geresnį našumą nei sąrašas situacijose, kai naudojami ne visi elementai. Seka modulis teikia manipuliacijas, susijusias su sekomis. Žemiau esančiame paveikslėlyje mes parodome paprastas sekas, sekas su išraiškomis ir sekas su filtrais.

F # palaiko duomenų teikėjus ir LINQ

Žemiau mes naudojame „TryFSharp“ redaktorių, norėdami atidaryti internetinį „Freebase“ meteorologijos duomenų rinkinį ir pateikti duomenų teikėjui užklausą dėl ciklonų, kurie užfiksavo didžiausias vėjo vertes. užklausa {} sintaksė įgyvendina LINQ F #. Šio DLL naudojimas yra būdingas „TryFSharp“. „Visual Studio“ norėtumėte atidarykite „Microsoft.FSharp.Data.TypeProviders“ ir tada naudokitės atitinkama duomenų teikėjo paslauga.

Rezultatas:

 [Uraganas Andriejus; Uraganas „Hugo“; 1900 m. Galvestono uraganas;

„Tropical Storm Allison“; Ciklonas Tracy; Uraganas „Iniki“; Uraganas Ivanas;

1999 m. „Odisha“ ciklonas; Uraganas „Katrina“; Taifūnas „Talim“; Uraganas „Rita“;

Taifūno žolė; Uraganas „Wilma“; Taifūnas „Vera“; 1962 m. Ramiojo vandenyno taifūnų sezonas;

Taifūnas Ike; Taifūnas Mireille; Taifūnas „Babe“; Atogrąžų audra Arlene;

Uraganas „Irene“; Taifūnas Zebas; Taifūnas Maemi; Taifūnas Bessas; Taifūnas Chanchu;

Taifūnas Patsy; Taifūnas „Ewiniar“; Uraganas „Ioke“; Taifūnas Xangsane'as;…

F # gali analizuoti „Hadoop“ duomenis

Šiame pavyzdyje mes naudojame „TryFsharp“ redaktorių, kad atidarytume „Hadoop Hive“ egzempliorių, kuriame, be kitų duomenų rinkinių, yra rainelės žiedų funkcijų matavimai ir matavimo vienetų anotacijos. Atitinkamai mes leidome naudoti vieneto komentarus „HiveTypeProvider“.

Šis skaičiavimas pateikia:

val avgPetalLength: plūdė = 0.0374966443

F # atlieka modelio derinimą

F # rungtynės išraiška suteikia išsišakojimo valdymą, pagrįstą išraiškos palyginimu su šablonų rinkiniu. Žemiau pateikto pavyzdžio 1–7 eilutėse apibrėžiamas rekursas isPalindromas funkcija. 8–10 eilutėse apibrėžta apvyniojimo funkcija isPalindromas tai vadina pirmą kartą naudojant visą eilutę. Kadangi "aba" yra palindromas, tada 9 eilutės sąlyga šaudo ir grįžta Kai kurie s, ir rungtynės teiginys 11 eilutėje generuoja „Eilutė aba yra palindromas“. _ modelis 14 eilutėje yra numatytasis atvejis.

degtukas .. | teiginys F # turi daug privalumų, palyginti su jungiklis..dėklas teiginys C #, C ++ ir Java, iš kurių svarbiausias yra tai, kad jis sukelia mažiau klaidų.

F # palaiko asinchronines darbo eigas

F # turi prieigą prie visos .NET Framework, tačiau ji taip pat turi savo asinchroninių darbo eigos sintaksę. asinchroninis {išraiška} sintaksė apibrėžia neužblokuojantį skaičiavimą. daryk! raktinis žodis atlieka asinchroninę operaciją ir laukia rezultato. leisti! raktinis žodis laukia asinchroninės operacijos ir priskiria rezultatą. Ir naudoti! laukia asinchroninės operacijos, priskiria rezultatą ir išleidžia šaltinį. Async.RunSynchronically vykdo asinchroninę operaciją ir laukia jos rezultato. Norėdami pridėti lygiagretumo, naudokite Asinchroninis lygiagretus funkcija, kuri užima sąrašą Async objektus, nustato kiekvieno kodą Async užduoties objektas paleisti lygiagrečiai ir grąžina Async objektas, kuris rodo lygiagretų skaičiavimą. Tada vamzdį, kad rezultatas Async.RunSynchronically. (Žemiau pateiktas pavyzdys yra iš F # skirta pramogoms ir pelnui.)

F # šaltiniai

Norėdami gauti daugiau informacijos apie F #, spustelėkite toliau pateiktas nuorodas.

  • Pabandykite F #
  • F # skirta pramogoms ir pelnui
  • F # Kalbos nuoroda
  • Realiojo pasaulio funkcinis programavimas
  • F # knygų „Amazon“
  • F # 3 baltoji knyga
  • Papildomos nuorodos