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 niekinis
arba 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