Teknisistä rajoituksista johtuen otsikon toivottua typografiaa ei voitu tehdä oikein.
F # | ||
Ensimmäisen version päivämäärä | 2002 | |
---|---|---|
Paradigma | Toimiva , välttämätön , olio | |
Kirjoittaja | Don Syme, Microsoft-tutkimus | |
Kehittäjä | F # Software Foundation | |
Viimeinen versio | 5,0 (10. marraskuuta 2020) | |
Kehitysversio | 5.0 esikatselu (2. huhtikuuta 2019) | |
Kirjoittaminen | Staattinen , vahva , nimellinen , päätelty | |
Vaikuttanut | OCaml , C # , Haskell | |
Toteutukset | .NET Framework , mustavalkoinen | |
Lisenssi | Apache-lisenssi | |
Verkkosivusto | fsharp.org | |
Tiedostopääte | fs, fsi, fsx ja fsscript | |
F # on .NET- alustan toiminnallinen , välttämätön ja olio- ohjelmointikieli . F # on kehittänyt Microsoft Research, ja sen ydin on johdettu OCaml- kielestä , jonka kanssa se on erittäin yhteensopiva. Nämä kaksi ohjelmointikieltä ovat osa samaa perhettä kuin ML-kielet .
Tämä kieli on suunniteltu nimenomaan .NET- alustalle , joten se on vahvasti olio-suuntautunut. Marraskuusta 2010 lähtien Microsoft on asettanut kaikkien ydinkirjastojen ja sen F #-kääntäjän saataville Apache 2 -lisenssillä .
F # on voimakkaasti kirjoitettu kieli, joka käyttää tyypin päättelyä . Tämä mekanismi delegoi muuttujien ja toimintojen kirjoittamisen kääntäjälle. Kielen avulla kehittäjä voi kuitenkin ilmoittaa nimenomaisesti tyypin ilmoituksessa. .NET-ekosysteemiin integroituna F # tukee alustan primitiivisiä tyyppejä ja sen esineitä. Lisäksi se laajentaa tyyppijärjestelmää ja mahdollistaa eron niin sanottujen muuttumattomien tyyppien ja muunneltavien välillä. Kohteita pidetään muokattavina (paikallaan) tyyppeinä, ja niitä käytetään objektin ohjelmointimallin asettamiseen kielen sisällä. Muuttamattomia tyyppejä käytetään ensisijaisesti ohjelmoitaessa toiminnallisesti; muuttumattoman tyypin muuttaminen luo uuden esiintymän korvaamatta vanhaa.
Kuten useimmat ML: stä johdetut kielet , F # on oletusarvoisesti tiukka arviointimekanismi . Kuitenkin, kuten Haskell , se voi toteuttaa laiska suoritus ilmausten avulla avainsanan lazy. Toiminnalliseen ohjelmointiin se tarjoaa useita rakenteita ja joukon muuttumattomia tyyppejä: joukot, tietueet, summatyypit ja luettelot.
Monikko on kokoelma n arvoa, n ≥ 0. n arvo vastaa arity ja monikko. Yksikkötyyppi edustaa tyhjää riviä, jonka ainoa mahdollinen arvo on (). Tätä tyyppiä käytetään toimintojen kirjoittamiseen, jotka eivät ota arvoa syötteeksi ja / tai palauttavat arvon. 3 tuplaa (tai triplettiä) edustaa (A, B, C), jossa A, B ja C voivat olla minkä tahansa tyyppisiä. Tuplaa voidaan käyttää arvojen tallentamiseen vain, kun arvojen lukumäärä tiedetään koodauksen aikana ja pysyy vakiona koko suorituksen ajan.
Ennätys on erikoistunut versio tuplat, joissa kenttiä on nimetty, kuten { Nom:string; Age:int }. Tallenteita voi luoda seuraavasti: { Nom="Toto"; Age=1 }. Avainsanaa withkäytetään luomaan kopio tietueesta: { r with Nom="CD" }luo uuden tietueen edellisestä tietueesta nimeltä r ja jonka arvo Nimi-kentässä muuttuu.
Luettelo tyyppi on ketjutetussa lista, joka voidaan esittää joko käyttäen merkintää head::tail(koostuu käyttäen operaattori ::, joka vastaa haittoja operaattorin Lisp / kaaviossa kielet ), tai lyhennetty merkintätapa: [item1; item2; item3]. Tyhjä luettelo on merkitty [].
Viimeinen algebrallinen tietotyyppi , summatyypit (jotka ovat toiminnallisesti vastaavia tyypillisiä liittojen C-kieliä), voidaan määritellä minkä tahansa yllä mainitun muuttumattoman tyypin summana. Esimerkiksi,
type A = | ConstructorX of string | ConstructorY of intvoivat sisältää arvoja, instantioida joko ConstructorXtai ConstructorY. Rakentajien palauttamien arvojen tyyppi voidaan myös määrittää.
Tässä on perinteinen hei-maailma :
(* Ceci est un commentaire *) printfn "Hello World!"Tämän muun perinteisen esimerkin toiminnallisilla kielillä pyritään osoittamaan ytimekkuus, joka voidaan saavuttaa tämän tyyppisillä kielillä:
let rec factorielle n = match n with | 0 -> 1 | _ -> n * factorielle (n - 1)Tämä muunnin, jossa on akku, toteuttaa päätteen rekursiota , joka on yleinen optimointi toiminnallisten kielten keskuudessa:
let factorielle n = let rec factorielle_recursive n accu = match n with | 0 -> accu | _ -> factorielle_recursive (n - 1) (n * accu) factorielle_recursive n 1