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