Programiranje

14 odličnih razlogov za uporabo F #

F # je močno natipkan, funkcionalno prvi programski jezik, ki vam omogoča reševanje zapletenih problemov s pisanjem preproste kode. F # temelji na ML in temelji na okolju .NET Framework, zato ponuja dobro interoperabilnost, prenosljivost in hitrost izvajanja ter "Five Cs" - jedrnatost, udobje, pravilnost, sočasnost in popolnost.

F # je bil sprva na voljo samo v sistemu Windows kot Microsoftov raziskovalni projekt, zdaj pa je prvovrstni jezik na številnih platformah. F # lahko uporabljate v računalnikih Mac in Linux s podporo orodja v Xamarin Studio, MonoDevelop, Emacs in drugih; v sistemu Windows z Visual Studio, Xamarin Studio in Emacs; ter v napravah Android in iOS ter v spletu z uporabo HTML5. Poleg splošnega programiranja F # velja tudi za kodo GPU, velike podatke, igre in še veliko več.

Zakaj uporabljati F #? Naj vam navedem 14 razlogov.

F # je interaktiven

Ena od prednosti F # je, da ima interaktivni REPL (branje, vrednotenje, tiskanje, zanka), kjer lahko preizkusite kodo, kot je prikazano na spodnji sliki zaslona. V desno v zgornjem levem kotu vidimo F # Interaktivna okna Visual Studio v sistemu Windows, TryFSharp, ki se izvaja v Chromu, in Xamarin Studio, ki se izvaja v Mac OS X. ;; pove F # Interactive, naj oceni, kaj ste vnesli; na TryFSharp gumb »zaženi« pošlje enak signal. Uporaba REPL za prevajanje in testiranje kode, preden gre v popoln program, pospeši razvoj in zmanjša napake.

F # je namenjen skriptiranju

F # se lahko uporablja kot skriptni jezik in tudi programski jezik. Spodaj vidimo vzorec Visual Studio, v katerem skript F # naloži štiri programske datoteke F # in odpre dve knjižnici .NET, preden izvede svojo kodo. Zapis [|…|] tukaj uporabljeno deklarira matriko. Zapis |> je prednja cev, ki rezultat leve strani prenese na funkcijo na desni strani. Nove vrstice tukaj niso skladenjsko pomembne. Kodo preprosto olajšajo branje, kot pa da imajo celotne cevne izraze v eni vrstici.

F # je funkcionalen

F # podpira konstrukcije funkcionalnega programiranja, kot so obravnavanje funkcij kot vrednosti, uporaba neimenovanih funkcij v izrazih, sestava funkcij za oblikovanje novih funkcij, ukrivljene funkcije in implicitna definicija funkcij z delno uporabo funkcijskih argumentov. V spodnjem posnetku zaslona spodaj določimo in uporabimo dodajte funkcijo. Telo funkcije je zamaknjeno (na primer Python), vrste argumentov pa so zaradi + operater. V spodnjem posnetku zaslona po imenu argumenta uporabimo pripis tipa z dvopičjem in imenom tipa, zato F # ve, da fraza je vrvica tip.

F # je jedrnat

Spodnja koda je Quicksort podoben algoritem, implementiran v F # (avtor Scott Wlaschin). The rec ključna beseda označuje, da je funkcija rekurzivna. The ujemanje..s sintaksa je stikalo izjava o steroidih, s | navaja primere. The [] označuje prazen seznam. The firstElem in drugi elementi se ustvarijo samodejno.

Upoštevajte, da nikjer v kodi ni omenjena izjava tipa, kar pomeni, da lahko funkcija razvrsti sezname, ki vsebujejo kateri koli tip, ki podpira operaterje primerjave. The zabavno ključna beseda je za definiranje anonimne lambda funkcije.

naj rec quickort seznam =

seznam ujemanja z

| [] -> // Če je seznam prazen

[] // vrne prazen seznam

| firstElem :: otherElements -> // Če seznam ni prazen

naj smallElements = // izvleče manjše

drugi elementi

|> List.filter (zabavno e ​​-> e <firstElem)

|> quicksort // in jih razvrsti

naj largerElements = // izvleče velike

drugi elementi

|> List.filter (zabavno e ​​-> e> = firstElem)

|> quicksort // in jih razvrsti

// 3 dele združite v nov seznam in ga vrnite

List.concat [smallElements; [firstElem]; večjiElementi]

// preizkus

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

Za primerjavo si oglejte spodnjo tradicionalno izvedbo C #.

javni razred QuickSortHelper

{

javni statični seznam QuickSort (vrednosti seznama)

kjer je T: neprimerljivo

   {

if (values.Count == 0)

      {

vrni nov seznam ();

      }

// dobimo prvi element

T firstElement = vrednosti [0];

// dobimo manjše in večje elemente

var smallElements = nov seznam ();

var largerElements = nov seznam ();

for (int i = 1; i <values.Count; i ++) // i se začne pri 1

{// ne 0!

var elem = vrednosti [i];

if (elem.CompareTo (firstElement) <0)

         {

smallElements.Add (elem);

         }

drugače

         {

largerElements.Add (elem);

         }

      }

// vrne rezultat

var rezultat = nov seznam ();

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

result.Add (firstElement);

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

vrniti rezultat;

   }

}

Opazili boste, koliko dodatne kode ima koda C # v primerjavi s kodo F #.

F # je res jedrnat

Po Scottu Wlaschinu ima spodaj prikazana različica hitrega sortiranja - vse štiri vrstice - tipičen jedrnat videz F #, ki ga je napisal izkušen funkcionalni kodirnik. Seveda bi bil prvi, ki bi opozoril, da se ne uredi na mestu. Potreboval sem več odčitkov, da sem razumel kodo, vendar je bilo vredno časa.

naj rec quicksort2 = funkcija

   | [] -> []                        

| najprej :: počitek ->

naj počivajo manjši, večji = List.partition ((> =))

List.concat [quicksort2 manjši; [prvi]; quicksort2 večji]

// preskusna koda

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

Na kratko, prvi primer vrne prazen seznam, če je bil izpolnjen, in zagotavlja izhodno merilo; drugi primer razdeli seznam na prvi element in preostali, podsest pa dodeli, pri čemer se začne z manjšo vrednostjo manjši in drugi podlist do večji. Znotraj združevanja pod seznamov funkcija rekurzivno razvrsti manjši in večji seznami.

F # z močnim tipkanjem zmanjšuje napake

Za razliko od JavaScript, Ruby in Python je F # močno natipkan, ne pa dinamično natipkan. Za razliko od C in C ++, ki sta prav tako močno tipizirana, vendar zahtevata deklariranje vseh vrst, F # izvede sklepanje o tipu, kadar koli je to mogoče. Kadar sklepanje o tipu ni mogoče, vendar je treba tip poznati, bo prevajalnik F # vrnil napako in predlagal, da vnesete opombo tipa, kot smo morali storiti v prejšnjem primeru za (fraza: niz) argument za toHackerTalk funkcijo. Ujemanje neusklajenosti tipa v času prevajanja odpravi cel razred napak med izvajanjem, ki so nagnjeni k dinamično natipkanim jezikom.

Mimogrede, F # pustiti vezi so nespremenljive, razen če jih posebej izjavite spremenljiv.

F # ima velik, dobro izbran nabor predmetov, vključno s seznamom, nizom in matriko

Kot lahko vidite iz IntelliSense spodaj, ima F # bogate module List, String in Array, ki temeljijo na .NET Framework. V tem pogledu je tudi objektno usmerjen jezik, čeprav je v prvi vrsti funkcionalen jezik. Upoštevajte, da je vseeno, ali uporabljate ime modula ali vneseno ime spremenljivke - ko dodate piko, se prikažejo funkcije članov. Nekateri trdijo, da je eksplicitna uporaba imena modula boljši slog funkcionalnega jezika kot pikčaste spremenljivke, vendar tega argumenta ne kupim popolnoma.

F # je uporaben za MapReduce

MapReduce je učinkovit dvostopenjski postopek, ki se pogosto uporablja pri velikih podatkih in je izrecno podprt v Hadoopu. V tem primeru F # preslikavamo in zmanjšujemo seznam celih števil. Najprej seznam filtriramo na soda števila, nato vsako število podvojimo, na koncu pa vsoto vseh elementov na seznamu združimo ali zmanjšamo rezultat. List.map je zmogljiva funkcija višjega reda; funkcija višjega reda je tista, ki za argument vzame drugo funkcijo. Poleg seznamov in nizov F # podpira zapise, zaporedja, ponudnike podatkovnih vrst in LINQ (jezikovno integrirana poizvedba).

F # ima zapise

Zapisi F # predstavljajo preproste agregate imenovanih vrednosti, po želji s člani. V spodnjem primeru najprej določimo a Knjiga vrsta zapisa s štirimi poimenovanimi vrednostmi, nato pa ustvarimo zapis z uporabo istih štirih imen. Prevajalnik F # pravilno sklepa Knjiga vnesite z ujemanjem imen.

Zapisi F # imajo lahko neobvezne vrednosti

Ni nujno, da zapisi vsebujejo vse imenovane vrednosti. Če navedete imenovano vrednost, možnost atribut, ko definirate vrsto, potem lahko ostane brez zapisa. Ko nastavite neobvezno vrednost, je lahko Nobenega, ki se konča kot a ničali pa je lahko Nekateri čemur sledi vrednost, ki jo želite nastaviti. Zapisna polja se od razredov razlikujejo po tem, da so samodejno izpostavljena kot lastnosti. Razredi in strukture v F # so .NET razredi in strukture, združljivi s C # in Visual Basic .NET, zato se bom odrekel primerom.

F # ima zaporedja

Zaporedje v F # je logična vrsta elementov vseh vrst. Zaporedja so še posebej koristna, če imate veliko, urejeno zbirko podatkov, vendar ni nujno, da boste uporabili vse elemente. Posamezni elementi zaporedja se izračunajo le po potrebi, zato lahko zaporedje zagotovi boljše delovanje kot seznam v primerih, ko niso uporabljeni vsi elementi. The Zap modul nudi podporo za manipulacije, ki vključujejo zaporedja. Na spodnji sliki prikazujemo preprosta zaporedja, zaporedja z izrazi in zaporedja s filtri.

F # podpira ponudnike podatkov in LINQ

Spodaj uporabljamo urejevalnik TryFSharp za odpiranje spletnega nabora meteoroloških podatkov Freebase in poizvedbo pri ponudniku podatkov za ciklone, ki so zabeležili najvišje vrednosti vetra. The poizvedba {} sintaksa izvaja LINQ za F #. Uporaba te DLL je značilna za TryFSharp. V Visual Studio bi to storili odprite ponudnike Microsoft.FSharp.Data.TypeProviders in nato uporabite ustrezno storitev ponudnika podatkov.

Rezultat:

 [Orkan Andrew; Orkan Hugo; 1900 orkan Galveston;

Tropska nevihta Allison; Ciklon Tracy; Orkan Iniki; Orkan Ivan;

1999 Odisha ciklon; Orkan Katrina; Tajfun Talim; Orkan Rita;

Typhoon Herb; Orkan Wilma; Tajfun Vera; 1962 sezona pacifiškega tajfuna;

Tajfun Ike; Tajfun Mireille; Tajfun Babe; Tropska nevihta Arlene;

Orkan Irene; Tajfun Zeb; Tajfun Maemi; Tajfun Bess; Tajfun Chanchu;

Tajfun Patsy; Tajfun Ewiniar; Orkan Ioke; Tajfun Xangsane;…

F # lahko analizira podatke Hadoop

V tem primeru z urejevalnikom TryFsharp odpremo primerek Hadoop Hive, ki med drugimi nabori podatkov vsebuje meritve značilnosti cvetov irisa, skupaj z oznakami merskih enot. V skladu s tem smo omogočili uporabo oznak enot v lastnostih HiveTypeProvider.

Ta izračun vrne:

val avgPetalLength: float = 0,0374966443

F # izvaja ujemanje vzorcev

F # tekmo izraz zagotavlja nadzor razvejanja, ki temelji na primerjavi izraza z naborom vzorcev. Vrstice 1-7 spodnjega primera opredeljujejo rekurzivnost isPalindrom funkcijo. Vrstice 8-10 definirajo funkcijo ovoja za isPalindrom ki ga prvič pokliče z uporabo celotnega niza. Ker je "aba" palindrom, je potem klavzula vrstice 9 se sproži in vrne Nekateri s, in tekmo stavek v vrstici 11 generira »Niz aba je palindrom«. The _ vzorec v vrstici 14 je privzeti primer.

The tekma .. | izjava v F # ima veliko prednosti pred stikalo..kat izjava v C #, C ++ in Java, najpomembnejša pa je ta, da povzroča manj napak.

F # podpira asinhrone delovne tokove

F # ima dostop do celotnega .NET Framework, vendar ima tudi svojo sintakso za asinhrone delovne tokove. The async {izraz} sintaksa definira neblokirajoči izračun. The naredi! ključna beseda izvede asinhrono operacijo in počaka na rezultat. The pustiti! ključna beseda čaka na asinhrono operacijo in dodeli rezultat. In uporaba! počaka na asinhrono operacijo, dodeli rezultat in sprosti vir. Async.RunSinhrono izvede asinhrono operacijo in počaka na njen rezultat. Če želite dodati vzporednost, uporabite Asinc. Vzporedno funkcija, ki zajema seznam Asinh predmeti, za vsakega nastavi kodo Asinh objekt vzporednega zagona in vrne Asinh objekt, ki predstavlja vzporedno računanje. Nato pripeljite ta rezultat do Async.RunSinhrono. (Spodnji primer je iz F # za zabavo in dobiček.)

Viri F #

Za več informacij o F # sledite spodnjim povezavam.

  • Poskusite F #
  • F # za zabavo in dobiček
  • Referenca jezika F #
  • Realno funkcionalno programiranje
  • F # knjige o Amazonki
  • F # 3 Bela knjiga
  • Dodatne reference
$config[zx-auto] not found$config[zx-overlay] not found