Ohjelmointi

14 erinomaista syytä käyttää F #

F # on voimakkaasti kirjoitettu, toiminnallisesti ensimmäinen ohjelmointikieli, jonka avulla voit ratkaista monimutkaisia ​​ongelmia kirjoittamalla yksinkertaisen koodin. ML #: n pohjalta rakennettu ja .NET Frameworkille rakennettu F # tarjoaa hyvän yhteentoimivuuden, siirrettävyyden ja ajonopeuden sekä "Five Cs" -tarkkuuden, selkeyden, mukavuuden, oikeellisuuden, samanaikaisuuden ja täydellisyyden.

F # oli alun perin käytettävissä vain Windowsissa Microsoft Research -projektina, mutta se on nyt ensiluokkainen kieli useilla alustoilla. Voit käyttää F #: tä Mac- ja Linux-käyttöjärjestelmissä Xamarin Studion, MonoDevelopin, Emacsin ja muiden työkalutukien kanssa; Windowsissa Visual Studion, Xamarin Studion ja Emacsin kanssa; ja Android- ja iOS-laitteilla sekä verkossa HTML5: n avulla. Yleiskäyttöisen ohjelmoinnin lisäksi F # soveltuu GPU-koodiin, big dataan, peleihin ja paljon muuta.

Miksi käyttää F #: ta? Annan teille 14 syytä.

F # on interaktiivinen

Yksi F #: n eduista on, että sillä on interaktiivinen REPL (lue, arvioi, tulosta, silmukka), jossa voit kokeilla koodia, kuten alla olevassa kuvassa näkyy. Myötäpäivään vasemmasta yläkulmasta näemme F # Interaktiiviset ikkunat Visual Studiosta Windowsissa, TryFSharpista käynnissä Chromessa ja Xamarin Studiosta Mac OS X: ssä. ;; kehottaa F # Interactive -yhtiötä arvioimaan kirjoittamasi tiedot; TryFSharpissa “run” -painike lähettää saman signaalin. REPL: n käyttäminen koodin kääntämiseen ja testaamiseen ennen kuin se menee täydelliseen ohjelmaan, sekä nopeuttaa kehitystä että vähentää virheitä.

F # on tarkoitettu komentosarjoille

F #: ta voidaan käyttää komentosarjakielenä sekä ohjelmointikielenä. Alla on Visual Studio -näyte, jossa F # -skripti lataa neljä F # -ohjelmatiedostoa ja avaa kaksi .NET-kirjastoa ennen oman koodin suorittamista. Merkintä [|…|] tässä käytetty taulukko ilmoittaa matriisin. Merkinnät |> on eteenpäin suuntautuva putki, joka siirtää vasemman puolen tuloksen oikealla puolella olevaan toimintoon. Uudet rivit eivät ole syntaktisesti merkittäviä. Ne vain helpottavat koodin lukemista kuin kokonaiset putkilausekkeet yhdellä rivillä.

F # on toiminnallinen

F # tukee toiminnallisia ohjelmointirakenteita, kuten funktioiden käsitteleminen arvoina, nimettömien funktioiden käyttäminen lausekkeissa, funktioiden koostumus uusien toimintojen muodostamiseksi, curry-funktiot ja funktioiden implisiittinen määrittely funktion argumenttien osittaisen soveltamisen avulla. Alla olevassa ylemmässä näyttökuvassa määritämme ja käytämme lisätä toiminto. Funktion runko on sisennetty (kuten Python) ja argumenttityypit päätetään kokonaislukuina + operaattori. Alemmassa näyttökuvassa toimitamme tyypin merkinnän argumentin nimen jälkeen kaksoispisteellä ja tyypin nimellä, joten F # tietää sen lause on merkkijono tyyppi.

F # on ytimekäs

Alla oleva koodi on Quicksortin kaltainen algoritmi, joka on toteutettu F #: ssä (Scott Wlaschin). Rec avainsana osoittaa, että toiminto on rekursiivinen. ottelu .. kanssa syntaksin a vaihtaa lausunto steroideista | tapausten ilmoittaminen. [] osoittaa tyhjää luetteloa. ensimmäinenElem ja muut elimet luodaan automaattisesti.

Huomaa, että missään koodissa ei mainita tyypin ilmoituksia, mikä tarkoittaa, että funktio voi lajitella luetteloita, jotka sisältävät mitä tahansa tyyppiä, joka tukee vertailuoperaattoreita. hauskaa avainsana on nimettömän lambda-funktion määritteleminen.

anna rec quicksort-luettelo =

ottelu luettelo

| [] -> // Jos luettelo on tyhjä

[] // palauta tyhjä luettelo

| firstElem :: otherElements -> // Jos luettelo ei ole tyhjä

anna pienempiäElement = // poimi pienemmät

muut elimet

|> List.filter (hauska e -> e <firstElem)

|> pikalajitelma // ja lajittele ne

anna suurempien elementtien = // poimia suuret

muut elimet

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

|> pikalajitelma // ja lajittele ne

// Yhdistä 3 osaa uuteen luetteloon ja palauta se

List.concat [pienempiElementit; [ensimmäinenElem]; suuremmatelementit]

//testata

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

Vertailun vuoksi, katso alla oleva perinteinen C # -toteutus.

julkisen luokan QuickSortHelper

{

julkinen staattinen luettelo QuickSort (Luettelon arvot)

missä T: Ivertailukelpoinen

   {

jos (arvot.Määrä == 0)

      {

palauta uusi luettelo ();

      }

// hae ensimmäinen elementti

T firstElement = arvot [0];

// hanki pienemmät ja suuremmat elementit

var pienempiElementit = uusi luettelo ();

var nagyobbElementit = uusi luettelo ();

for (int i = 1; i <arvot; lukumäärä; i ++) // i alkaa arvosta 1

{// ei 0!

var elem = arvot [i];

if (elem.CompareTo (firstElement) <0)

         {

pienempiElementit.Lisää (elem);

         }

muu

         {

nagyobbElementit.Lisää (elem);

         }

      }

// palauta tulos

var tulos = uusi luettelo ();

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

result.Add (firstElement);

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

paluutulos;

   }

}

Huomaat kuinka paljon ylimääräistä matkaa C # -koodi on verrattuna F # -koodiin.

F # on todella ytimekäs

Scott Wlaschinin mukaan alla esitetyllä quicksort-versiolla - sen kaikilla neljällä rivillä - on tyypillinen F #: n tyylikäs ilme, jonka on kirjoittanut kokenut toiminnallinen kooderi. Tietenkin hän olisi ensimmäinen, joka huomauttaa, että se ei lajittele paikalleen. Minulta kesti useita lukemia ymmärtääksesi koodin, mutta se oli sen arvoinen.

anna rec quicksort2 = funktio

   | [] -> []                        

| ensimmäinen :: lepo ->

anna pienempien, suurempien = List.partition ((> =) ensin) levätä

List.concat [quicksort2 pienempi; [ensimmäinen]; quicksort2 suurempi]

// testikoodi

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

Lyhyesti sanottuna ensimmäinen tapaus palauttaa tyhjän luettelon, jos se on ylitetty, tarjoten poistumiskriteerin; toinen tapaus jakaa luettelon ensimmäiseksi elementiksi ja muiksi ja määrittelee alemmalle arvolle alkavan alilistan pienempi ja toinen alaluettelo suurempi. Alilistojen ketjutuksessa toiminto lajittelee rekursiivisesti pienempi ja suurempi luettelot.

F # vähentää vikoja vahvan kirjoittamisen avulla

Toisin kuin JavaScript, Ruby ja Python, F # kirjoitetaan voimakkaasti, ei dynaamisesti. Toisin kuin C ja C ++, jotka ovat myös voimakkaasti kirjoitettuja, mutta edellyttävät kaikkien tyyppien ilmoittamista, F # suorittaa tyyppipäätökset aina kun mahdollista. Kun tyypin päättely ei ole mahdollista, mutta tyyppi on tiedettävä, F # kääntäjä heittää virheen ja ehdottaa, että annat tyyppimerkinnän, kuten jouduttiin tekemään aikaisemmassa esimerkissä (lause: merkkijono) argumentti toHackerTalk toiminto. Tyyppien ristiriidan saaminen kääntöhetkellä eliminoi koko luokan ajonaikaisia ​​virheitä, joille dynaamisesti kirjoitetut kielet ovat alttiita.

Muuten, F # päästää siteet ovat muuttumattomia, ellet erikseen ilmoita niitä vaihteleva.

F #: lla on suuri, hyvin valittu joukko objekteja, mukaan lukien luettelo, merkkijono ja taulukko

Kuten alla olevasta IntelliSense-ohjelmasta näet, F #: lla on runsaasti .NET Framework -perusteisia List-, String- ja Array-moduuleja. Tässä mielessä se on myös olio-orientoitu kieli, vaikka se on ennen kaikkea toiminnallinen kieli. Huomaa, että sillä ei ole väliä, käytätkö moduulin nimeä vai kirjoitettua muuttujan nimeä - kun lisäät pisteen, jäsenfunktiot tulevat esiin. Jotkut väittävät, että moduulin nimen nimenomainen käyttö on toiminnalliselle kielelle parempi tyyli kuin pisteviivat muuttujat, mutta en osta tätä argumenttia kokonaan.

F # on hyödyllinen MapReducessa

MapReduce on tehokas kaksivaiheinen prosessi, jota käytetään usein isoissa tiedoissa ja jota Hadoop tukee nimenomaisesti. Tässä F # -esimerkissä kartoitetaan ja pienennetään kokonaislukujen luetteloa. Suodatetaan ensin luettelo parillisiin numeroihin, sitten kaksinkertaistetaan kukin luku ja lopuksi otamme luettelon kaikkien elementtien summa yhteen tai pienennä tulosta. Luettelo. Kartta on tehokas korkeamman asteen toiminto; korkeamman asteen funktio on funktio, joka ottaa toisen funktion argumenttina. Luetteloiden ja taulukoiden lisäksi F # tukee tietueita, sekvenssejä, tietotyyppien tarjoajia ja LINQ (kieli-integroitu kysely).

F #: lla on tietueita

F # -tietueet edustavat yksinkertaisia ​​nimettyjen arvojen aggregaatteja, mahdollisesti jäsenten kanssa. Alla olevassa esimerkissä määritellään ensin a Kirja tietuetyyppi, jossa on neljä nimettyä arvoa, ja sitten luomme tietueen käyttämällä samoja neljää nimeä. F # kääntäjä päättelee oikein Kirja kirjoita vastaamalla nimiä.

F # -tietueilla voi olla valinnaisia ​​arvoja

Tietueiden ei aina tarvitse sisältää kaikkia nimettyjä arvoja. Jos annat nimellisen arvon vaihtoehto määritteen tyypin, se voidaan jättää tietueesta pois. Kun asetat valinnaisen arvon, se voi olla joko Ei mitään, joka päättyy a tyhjätai se voi olla Jonkin verran jota seuraa asetettava arvo. Tallennuskentät eroavat luokista, koska ne näkyvät automaattisesti ominaisuuksina. F #: n luokat ja rakenteet ovat .NET-luokkia ja -rakenteita, jotka ovat yhteensopivia C #: n ja Visual Basic .NET: n kanssa, joten hylkään esimerkkejä.

F #: lla on sekvenssejä

Sarja F #: ssa on looginen sarja elementtejä, jotka ovat kaikki yhtä tyyppiä. Sekvenssit ovat erityisen hyödyllisiä, kun sinulla on suuri, järjestetty tietokokoelma, mutta et välttämättä odota käyttävänsi kaikkia elementtejä. Yksittäiset sekvenssielementit lasketaan vain tarpeen mukaan, joten sekvenssi voi tarjota paremman suorituskyvyn kuin luettelo tilanteissa, joissa kaikkia elementtejä ei käytetä. Seq moduuli tukee sekvensseihin liittyviä manipulaatioita. Alla olevassa kuvassa esitetään yksinkertaiset sekvenssit, sekvenssit ilmaisuilla ja sekvenssit suodattimilla.

F # tukee tietojen tarjoajia ja LINQ: ta

Seuraavassa käytämme TryFSharp-editoria avataksemme online-Freebase-meteorologian tietojoukon ja kyselemällä tietojen tarjoajalta sykloneja, jotka ovat tallentaneet korkeimmat tuuliarvot. kysely {} syntaksilla toteutetaan LINQ for F #. Tämän DLL: n käyttö on nimenomaan TryFSharp. Visual Studiossa haluaisit avaa Microsoft.FSharp.Data.TypeProviders ja käytä sitten asianmukaista tiedon tarjoajapalvelua.

Lopputulos:

 [Hurrikaani Andrew; Hirmumyrsky Hugo; 1900 Galvestonin hurrikaani;

Trooppinen myrsky Allison; Sykloni Tracy; Hurrikaani Iniki; Hurrikaani Ivan;

1999 Odishan sykloni; Hurrikaani Katrina; Taifuuni Talim; Hurrikaani Rita;

Taifuuni yrtti; Hirmumyrsky Wilma; Taifuuni Vera; Tyynenmeren taifuunikausi 1962;

Taifuuni Ike; Taifuuni Mireille; Taifuuni babe; Trooppinen myrsky Arlene;

Hurrikaani Irene; Taifuuni Zeb; Taifuuni Maemi; Taifuuni Bess; Taifuuni Chanchu;

Taifuuni Patsy; Taifuuni Ewiniar; Hurrikaani Ioke; Taifuuni Xangsane;…

F # voi analysoida Hadoop-tietoja

Tässä esimerkissä käytämme TryFsharp-editoria avaamaan Hadoop Hive -esiintymän, joka sisältää muiden tietojoukkojen joukossa iiriskukkaominaisuuksien mittaukset yhdessä mittayksiköiden merkintöjen kanssa. Näin ollen olemme ottaneet käyttöön yksikkömerkintöjen käytön HiveTypeProvider.

Tämä laskelma palauttaa:

val avgPetalLength: float = 0,0374966443

F # tekee kuvion vastaavuuden

F # ottelu lauseke tarjoaa haarautumisen hallinnan, joka perustuu lausekkeen vertailuun joukon malleja. Alla olevan esimerkin rivit 1-7 määrittelevät rekursiivisen isPalindromi toiminto. Rivit 8-10 määrittävät käärintätoiminnon isPalindromi se kutsuu sitä ensimmäisen kerran koko merkkijonon avulla. Koska "aba" on palindromi, sitten rivin 9 lauseke ampuu ja palaa Jotkut s, ja ottelu rivin 11 lauseke tuottaa "merkkijono aba on palindromi". _ kuvio rivillä 14 on oletustapaus.

ottelu .. | F # -lausekkeella on monia etuja kytkin..kotelo lause C, C ++ ja Java, joista tärkein on, että se aiheuttaa vähemmän virheitä.

F # tukee asynkronisia työnkulkuja

F #: lla on pääsy kaikkiin .NET Frameworkiin, mutta sillä on myös oma syntaksinsa asynkronisille työnkulkuille. asynkronoi {lauseke} syntaksissa määritetään ei-estävä laskenta. tehdä! avainsana suorittaa asynkronisen operaation ja odottaa tulosta. päästää! avainsana odottaa asynkronista operaatiota ja määrittää tuloksen. Ja käyttää! odottaa asynkronista operaatiota, määrittää tuloksen ja vapauttaa resurssin. Async. Suorita synkronisesti suorittaa asynkronisen toiminnan ja odottaa sen tulosta. Lisää rinnakkaisuus käyttämällä Asynkronoitu rinnakkain -toiminto, joka vie luettelon Asynkronointi objektit, määrittää koodin kullekin Asynkronointi tehtäväobjekti suoritettavaksi rinnakkain ja palauttaa Asynkronointi objekti, joka edustaa rinnakkaista laskentaa. Sitten putki että tulos Async. Suorita synkronisesti. (Alla oleva esimerkki on F # hauskaa ja voittoa varten.)

F # resursseja

Jos haluat lisätietoja F #: sta, seuraa alla olevia linkkejä.

  • Kokeile F #
  • F # hauskaa ja voittoa varten
  • F # Kieliviite
  • Reaalimaailman toiminnallinen ohjelmointi
  • F # kirjoja Amazonissa
  • F # 3 valkoinen kirja
  • Lisäviitteet