F Sharp
__БЕЗКН__

-{F#}- je strogo tipiziran programski jezik sa otvorenim (-{open-source}-) kodom pod -{OSI-approved Apache 2.0}- licencom i prvoklasni jezik u programskom okruženju Vizuelnog Studia. Razvijen je kao -{.NET}- implementacija jezgra programskog jezika -{OCalm}- pod uticajem programskih jezika -{C#}-, -{Python}-, -{Haskell}-, -{Scala}- i -{Erlang}-. Ovo je programski jezik sa izraženim funkcionalnim karakteristikama, ali podržava i druge programske paradigme poput imperativne i objektno-orijentisane.

-{F#}- је izražajan i koncizan. Služi za pisanje jednostavnih kodova koji će rešavati kompleksne probleme. Iz poslovne perspektive, glavna uloga -{F#}--a je da smanji vreme potrebno za realizaciju analitičkih softverskih komponenti u savremenom preduzeću. Snaga -{F#}--a leži u svedenoj sintaksi koja omogućava laku čitljivost koda, kao i efikasan razvoj programa koji zahtevaju primenu složenih matematičkih algoritama. Omogućava brzo generalisanje prototipova kao i njihovu brzu transformaciju u produktivni kod. Omogućava da programeri direktnije sprovode svoje algoritme (manje koda za čitanje i održavanje, kao i brza igrada prototipova). Korišćenjem programskog jezika -{F#}- kao osnovnog jezika mogu se lako kreirati domensko specifični jezici (-{DSL}-) što ga čini pogodnim za naučno – istraživačke primene. Studije slučaja i prijave korisnika pokazuju da stroga tipiziranost programskog jezika -{F#}- smanjuje softverske greške.
 
Kod napisan u jeziku -{F#}- možemo lako paralelizovati, što je veoma značajno kod računara sa više jezgara. -{F#}- poseduje medernu -{just-in-time (JIT)}- kompilaciju do izvornog koda. Brzina izvršavanja rezultujućeg koda je mnogo veća no kod jezika kao što su -{Python}-, -{JavaScript}- ili -{R}-, a u pojedinim slučajevima značajno brža od programskog jezika -{C#}-. Koristeći -{F#}- interaktivno, kod se može odmah izvršiti bez prvog kompajliranja, što omogućava tečnije istraživanje problema. Programeri mogu koristiti -{F#}- interaktivno kako bi iterativno pobošali algoritme. Kod će se izvršavati i na 32-bitnom i na 64-bitnim sistemima uz korišćenje upustva za odgovarajuce arhitekture. 

-{F#}- možemo koristiti na -{Mac OS X}-, -{Linux}-, -{Android}-, -{HTML5}- i ostalim platformama. On je kompatibilan sa svim ostalim -{.NET}- jezicima, što znači da -{F#}- program može da koristi sve -{.NET}- biblioteke. Biblioteka napisana u -{F#}--u može se koristiti u bilo kojoj -{Desktop}- ili -{Web}- aplikaciji razvijenoj na -{.NET}- platformi.

Istorijski razvoj

Verzije 
-{F#}- je prošao kroz nekoliko verzija tokom svog razvoja.

Evolucija jezika 

Programski jezik -{F#}- je prvobitno dizajnirao i implementirao -{Don Syme}- iz -{Microsoft Research}--a. Zatim je -{James Margetson}- pristupio timu -{Microsoft Research}- i ostvario veliki doprinos u razvoju ovog programskog jezika. -{F#}- je povezan sa dizajnom generika za -{.NET}-. -{Andrew Kennedy}- je bio ko-dizajner generika i -{Units-of-mentions}- (jedinica mere) za -{F#}-. -{Mads Torgorsen}- i -{Raj Pai}- su bili odgovorni za postavlajnje inicijalnog terena za stvaranje -{Visual F#}- i -{Microsoft Developer Division.}-

Funkcionalno programiranje 

-{F#}- je prvi striktno funkcionalni programski jezik koji podržava zaključivanje tipova. To znači da programer ne mora da deklariše tipove, nego će kompilator sam zaključiti tip tokom kompilacije. -{F#}- je jezik zasnovan na izrazima. Svaka naredba u -{F#}- uključujući i -{if}- naredbu, -{try}- izraze i petlje, spaja se sa izrazima statičkog tipa. Funkcije i izrazi koji ne vraćaju neku vrednost imaju povratni tip -{unit}-. -{F#}- koristi ključnu reč -{let}- da dodeli vrednosti promenjivoj. Na primer:
   -{let}- x=3+4 
dodeljuje vrednost 7 promenjivoj x.

Novi tipovi se definišu koisteći ključnu reč -{type}-. Za funkcionalno programiranje -{F#}- podržava torke, rekorde, diskriminišuće unije, liste i opcione tipove. 

Torka predstavlja kolekciju od -{n}- vrednosti, gdje je -{n≥0}-. Vrednost -{n}- se zove arnost torke. Trojka će biti predstavljena kao -{(A, B, C)}-, gdje su -{A, B}- i -{C}- vrednosti eventualno različitih tipova. Torka može biti korištena samo kada je broj vrednosti poznat u vreme pravljena torke i taj broj ostaje konstantan tokom izvršenja programa. 

Diskriminišuća unija predstavlja tip podataka čija vrednost može biti u skladu sa samo jednim od definisanih diskriminatora. U svom najjednostavnijem obliku diskriminator predstavlja jednu vrednost, a diskriminišuća unija skup vrednosti. Tada tip diskriminišuća unija semantički podseća na tip enumeracija u programskom jeziku -{C#}-. 

Rekord je tip u kome se članovi podataka imenuju kao:
  -{ {Ime:string; Godine:int}}-
Može biti kreiran kao:
  -{ {Ime:”AB”; Godine:42}}-
Ključna reč -{with}- se koristi da napravi kopiju rekorda kao na primer:
  -{ {r with ime=”CD”}}-
Ovim izrazom se kreira novi rekord tako što se prvo kopira -{r}-, a zatim menja vrednost u polju ime (Pretpostavljamo da je rekord kreiran u prethodnom primeru imenovan sa -{r}-). 

U -{F#}- postoji tip -{list}- i označava nepromenjivu povezanu listu. Lista se predstavlja koristeći -{head::tail}- notaciju (:: je kontra operator) ili kao -{[item1; item2; item3]}-. Praznu listu označavamo sa []. 

Opcioni tip je diskriminišuća unija sa izborima -{Some(x)}- ili -{None}-. 

-{F#}- podržava lambda račun. Sve funkcije u -{F#}- su nemutabilne. Funkcije mogu biti prosleđene kao agumenti drugim funkcijama.

Imperativno programiranje 

Pod imperativnim programiranjem se podrazumeva pisanje programa, koji tokom izvršavanja više puta upisuju podatke na istu memorijsku lokaciju. U programskim jezicima, kao što su
-{C++}-, -{C#}- ili -{Visual Basic}- to je potpuno uobičajno. Nasuprot tome, naredba -{let}- u -{F#}--u prilikom svakog povezivanja vrednosti sa identifikatorom upisuje vrednost u novu memorijsku lokaciju.
Naravno, ponekad postoji potreba da se i u -{F#}- programima piše imperativni kod. To je uglavnom slučaj kad se postojeći, složeni algoritmi, sa nekog imperativnog programskog jezika prenose u -{F#}-. 

Sintaksa programskog jezika -{F#}- razlikuje tri vrste promenljivih struktura, i to:
 Lokalne promenljive
 Reference
 Slogove sa promenljivim poljima

Lokalne promenljive 

Lokalne promenljive definišu se tako što se posle naredbe povezivanja -{let}- upotrebljava ključna reč -{mutable}-. Promena lokalne promenljive vrši se pomoću operatora strelica ulevo (<-).
Lokalne promenljive imaju određena ograničenja, a najznačajnije od njih je da se mogu koristiti samo u sopstvenoj oblasti definisanosti ( npr. prilikom vraćanja lokalne promenljive iz funkcije ne vraća se sama lokalna promenljiva, nego kopija njene vrednosti).

Reference 

Referenca predstavlja objektni omotač (ćeliju) u kojoj je smeštena vrednost koja se može menjati tokom izvršavanja programa. Vrednost se smešta u referencu primenom funkcije -{ref}-.
Sadržaju reference pristupa se pomoću operatora (!), dok se za izmenu sadržaja koristi operator (:=).

Slogovi sa promenljivim poljima 
Sintaksa programskog jezika -{F#}- omogućava definisanje slogova sa promenljivim poljima. Promenljiva polja definišu se pisanjem ključne reči -{mutable}- ispred naziva polja.

Nizovi 
Niz (engl. -{array}-) je kolekcija promenljivih elemenata istog tipa. Implemetacija niza je takva da su elementi koji ga čine smešteni u memoriji neposredno jedan posle drugog.  Zbog toga je pri deklaraciji niza potrebno tačno znati koliko će elemenata biti u nizu. Prednost ovakve implementacije je u tome što omogućava efikasan pristup proizvoljnom elementu niza. 
Nizovi se mogu kreirati pomoću generatorskih izraza, poput lista i sekvenci ili zadati kao lista vrednosti odvojenih znakom ; između znakova [| i |]. Na primer:
   -{let arr}- = [| 1.0 ; 2.0; 3.0 |] 

Elementima niza pristupa se pomoću operatora indeksiranja (.[]) . Operator indeksiranja upotrebljava se kako kod čitanja tako i kod menjanja sadržaja elementa niza. , na primer:
   -{arr.[1]<-5}-
upisuje vrednost 5 na poziciju 1.

Petlje 
Imperativno programiranje podrazumeva eksplicitnu kontrolu toka izvršavanja programa. Takva kontrola podrazumeva i upotrebu petlji koje omogućavaju repetativno izvršavanje određenog dela koda određeni broj puta, odnosno do ispunjenja datog uslova.
Programski jezik -{F#}- podržava -{while}- petlju i dve vrste -{for}- petlje.

-{While}- petlja 
-{While}- petlja se izvršava sve dok uslov ciklusa vraća logičku vrednost -{true}-.  Sledeći primer ilustruje primenu -{while}- petlje za izračunavanje zbira celih brojeva od 1 od -{n}-.
   -{let mutable zbir = 0
   let mutable i=1
   while (i<=n) do
      zbir <- zbir + i
      i <- i + 1}-

-{For}- petlja 
-{For}- petlja se koristi kada je unapred poznat broj iteracija koje treba da budu izvršene. 
 
Jednostavna forma -{for}- petlje podrazumeva postojanje celobrojne ciklusne promenljive (brojača) u zaglavlju petlje, koja uzima vrednosti između donje i gornje granice.  Sledeći primer je ekvivalentan prethodnom, samo što je ovaj put za rešavanje problema upotrebljen jednostavan oblik -{for petlje}-.

   -{let mutable zbir = 0
   for i=1 to n do
      zbir <- zbir + 1}-

Nabrojiva forma -{for}- petlje podrazumeva postojanje ciklusne promenljive koja uzima vrednosti redom iz proizvoljne sekvence.  U primeru koji sledi, zatvoreni interval celih brojeva zadat je sekvencom u formi liste celih brojeva od 1 do -{n}-.
   -{let mutable zbir = 0
   for i in [1, n] do
      zbir <- zbir + 1}-

Objektno orijentisano programiranje 

Najveći deo -{.NET}- platforme napisan je u objektno orijentisanim programskim jezicima, prvenstveno u programskom jezicima -{C#}-. Zato je poznavanje objektno orijentisanog programiranja od ključne važnosti za korišćenje brojnih -{.NET}- biblioteka.
Objektno orijentisan stil programiranja pogodan je za pisanje kompleksnih softverskih sistema. Navedena pogodnost se ogleda u mogućnosti da se objekti iz realnog sveta modeluju pomoću softverskih abstrakcija, klasa. 

Klasa je sintaksni element koji povezuje funkcije i podatke.
Sintaksa programskog jezika -{F#}- definiše više elemenata koji se iz objektno orijentisanih programskih jezika vide kao klase.  To su:
 Slog
 Unija diskriminatora
 Izuzetak
 Klasa
 Modul

Primer definisanja klase:
  -{ type Vektor2D(dx:float, dy:float)=
      member t.DX=dx
      member t.DY=dy
      member t.duzina=sqrt(dx*dx+dy*dy)
      member t.pomnoziSkalarom(k)=Vektor2D(k*dx,k*dy)
      static member Nula=Vektor2D(0., 0.)}-

Objekat klase -{Vektor2D}- kreiramo navođenjem imena klase i prosleđivanjem vrednosti parametara potrebnih za inicijalizaciju objekta.

Svojstva služe za pristup podacima. Najčešće su to sirovi podaci prezentovani na način kako su definisani u poljima, ali mogu biti i izračunate vrednosti (npr. svojstvo -{duzina}- zavisi od veličine više polja). 
Slično kao i u drugim objektno orijentisanim programskim jezicima, svojstva mogu pripadati klasi umesto pojedinim objektima date klase. Takva svojstva nazivaju se statička, a u programskom kodu označavaju se pomoću ključne reči -{static}-:
   -{static member Nula = Vektor2D(0.,0.)}-
Statička svojstva najčešće se koriste za kreiranje specifičnih objekata date klase (npr. nula vektor). 

Metoda predstavlja operaciju koju je moguće izvršiti nad objektom. Prilikom definisanja metode u zaglavlju se pored naziva navodi i skup parametara potrebnih za njeno pozivanje. U primeru je data metoda -{pomnoziSkalarom}- koja prima parametar k tipa -{float}- i vraća -{Vektor2D}- objekat čije su dimenzije uvećane -{k}- puta.
  -{ member t.pomnoziSkalarom(k) = Vektor2D(k*dx,k*dy)}-

Iako je preporučljivo da -{F#}- klase budu nepromenljive, moguće je napisati i klasu koja tokom izvršenja programa menja svoje stanje. 
Definisanje promenljive klase ilustrovano je na sledećem primeru:
  -{ type Vektor2D(dx:float, dy:float)=
      let mutable dx=dx
      let mutable dy=dy
      member t.DX with get()=dx and set v=dx<-v
      member t.DY with get()=dy and set v=dy<-v
      member t.duzina=sqrt(dx*dx+dy*dy)
      member t.pomnoziSkalarom(k)=Vektor2D(k*dx,k*dy)
      static member Nula=Vektor2D(0., 0.)}-

Asinhrono programiranje 

-{F#}- podržava asinhrono programiranje kroz asinhrone radne procese počev od verzije 1.9.2.9. Asinhroni procesi rada su jedna aplikacija -{F#}--ove sintakse računanja izraza. Ovo je jedan primer kako bi dva asinhrona procesa rada mogla da se izvršavaju paralelno:
    -{let task1 = async { return 10+10 }
    let task2 = async { return 20+20 }
    Async.Run (Async.Parallel [ task1; task2 ])}-
U navedenom primeru izraz -{“async { return 10+10 }”}- kreira jedan objekat tipa -{Async<int>}-. Ove vrednosti nisu pravi rezultati već su specifične za ovaj konkretan zadatak.
Izraz -{“Async.Parallel [ task1; task2 ]”}- spaja dva zadatka i kreira novi. Ovo pravi novu vrednost tipa -{Async<int[]>}-. -{Async.run}- dobija ove vrednosti i pokreće se kako bi vratio niz [| 20; 40 |].

Asinhroni radni proces je definisan kao sekvenca komandi unutar -{"async"}- bloka -{(Async{.....})}-, kao u sledećem primeru:
    -{let asynctask = 
    async { let req = WebRequest.Create(url)
            let! response = req.GetResponseAsync()
            use stream = response.GetResponseStream()
            use streamreader = new System.IO.StreamReader(stream)
            return streamreader.ReadToEnd() }}-
Komanda -{let!}- nam govori da izraz sa desne strane -{(req.GetResponseAsync())}- treba da se uradi asinhrono, ali da nit treba da se nastavi samo kada je rezultat dostupan. Sa gledišta bloka koda, ovo je kao da dobijanje odgovora blokira sam poziv, dok sa gledišta sistema nit neće biti blokirana i može biti korišćena za obradu drugih niti dok rezultat potreban za nju ne postane dostupan.
Asinhroni blok može biti pozvan korišćenjem funkcije -{Async.RunSynchronously}-. Više -{"async"}- blokova mogu da se izvrše paralelno korišćenjem funkcije -{Async.Parallel}- koja uzima listu -{"async"}- objekata (u navedenom primeru -{"asynctrack"}- je jedan -{"async"}- objekat) i pravi novi -{"async"}- objekat kako bi izvršila zadatke iz liste paralelno. Rezultujući objekat se poziva korišćenjem funkcije -{"Async.RunSynchronously"}-. Inverzija kontrole u -{F#}- prati ovaj obrazac.

Paralelno programiranje 

Paralelno programiranje je delimično podržano kroz -{"Async.Parallel"}-, -{"Async.Start"}- i drugih operacija koje izvršavaju asinhrone blokove paralelno. Paralelno programiranje je takođe podržano kroz -{"Аrray.Parallel"}-, operatorom funkcionalnog programiranja iz standardne biblioteke -{F#}-, direktnom upotrebom -{System.Threading.Task}-, direktnom upotrebom -{.Net}- zajedničkih niti i -{.Net}- niti. One dinamički prevode -{F#}- kod na jezike alternativnih mašina koje izvršavaju parelizaciju. Jedan primer je -{GPU}- kod.

Jedinice mere 

-{F#}- je tip sistema koji podržava provere brojeva korišćenjem jedinica mera. Jedinica mere je karakteristika koja nam, zajedno sa tipom zaključivanja sistema -{F#}-, omogućava da imamo minimalan broj komentara u našem kodu.
Podaci tipa -{float}- ili označenog -{int-a}- mogu da imaju sebi pridružene jedinice mere, koje se najčešće koriste kako bi bliže opisale taj pojam, recimo njegovu dužinu, zapreminu ili masu. Koristeći ove oznake mi omogućavamo kompajleru da utvrdi da li operanti u nasem izrazu imaju odgovarajuće jedinice mere, što pomaze pri sprečavanju grešaka u programu.
Sintaksa je sledeća:
    -{[<Measure>] type mera-ime [ = measure ]}-
U navedenom primeru smo definisali promenjivu mera-ime kao jedinicu mere. Opcioni deo se koristi da definiše mere za prethodno definisane jedinice. Na primer možemo definisati meru u centimetrima ili kubnim centimetrima :
    -{[<Measure>] type cm}-

    -{[<Measure>] type ml = cm^3}-
U sledećem primeru možemo videti još neke od postojećih jedinica mera ali i način kako da ih konvertujemo iz bezdimenzionih brojeva u dimenzione vrednosti.
   -{// Masa, grami.
   [<Measure>] type g
   // Masa, kilogrami.
   [<Measure>] type kg
   // Težina, pounds.
   [<Measure>] type lb
   // Distanca, metri.
   [<Measure>] type m
   // Distanca, cm
   [<Measure>] type cm
   // Distanca, inches.
   [<Measure>] type inch
   // Distanca, stope
   [<Measure>] type ft
   // Vreme, sekunde.
   [<Measure>] type s
   // Sila, Njutn.
   [<Measure>] type N = kg m / s
   // Pritisak, bar.
   [<Measure>] type bar
   // Pritisak, Paskal
   [<Measure>] type Pa = N / m^2
   // Gustima, mililitri.
   [<Measure>] type ml
   // Gustina, litri.
   [<Measure>] type L
   // Definisanje transformacionih konstanti.
   let gramsPerKilogram : float<g kg^-1> = 1000.0<g/kg>
   let cmPerMeter : float<cm/m> = 100.0<cm/m>
   let cmPerInch : float<cm/inch> = 2.54<cm/inch>
   let mlPerCubicCentimeter : float<ml/cm^3> = 1.0<ml/cm^3>
   let mlPerLiter : float<ml/L> = 1000.0<ml/L>
   // Definisanje transformacionih funkcija
   let convertGramsToKilograms (x : float<g>) = x / gramsPerKilogram
   let convertCentimetersToInches (x : float<cm>) = x / cmPerInch}-

Meta-programiranje 

-{F#}- omogućava neke forme personalizacije sintakse kako bi podržao ugrađivanje jedinstvenih domen-specifičnih jezika unutar samog jezika -{F#}-. -{F#}- takodje sadrži odliku run-time meta-programiranja pod nazivom citati[]. Izraz ovog tipa se tretira kao izraz abstraktne sintakse koja je reprezentacija izraza iz -{F#}-. Definiciji koja je obeležena sa atributom
-{"[<ReflectedDefinition>]"}- se takođe moze pristupiti u njenom citatnom obliku. -{F#}- citati se koriste u raznovrsne svrhe kao sto je na primer kompilacija -{F#}- koda u -{JavaScritp}- ili -{GPU}-  kod.

Programiranje bogato informacijama 

Od verzije F# 3.0 postoji oblik programiranja kroz F# tip provajdera. To znači da od ove verzije F# kompajler može da kompajlira različite izvore podataka kao deo programiranja jezika sistema. Ovo je od velikog značaja programerima jer oni u trenutku pisanja koda dobijaju proveru sintaksnih grešaka. Neki od tipova provajdera koji postoje su:

 -{JSON}- format

 -{CSV}- fajlovi ("Sirovi" onlajn podaci se u velikoj meri čuvaju na ovaj način.)

 Slobodna baza (Internet baza podataka koja sakuplja informacije sa različitih izvora. Iako se iz ovog tipa provajdera teško izvlače strukture podataka, koristan je zbog raznih drugih listi. Ukoliko je veća količina internet saobraćaja sa iste IP adrese, slobodna baza će na određeno vreme blokirati tu -{IP}- adresu.)

 Svetska banka (Organizacija pod okriljem Ujedinjenih nacija.)

 -{SQL}- server

 -{Azure Marketplace}- (Pogodan kod pretrage određenog proizvoda kada korisnik tačno zna u kojoj grupi je traženi proizvod, čime se pretraga drastično sužava.)

Naravno, ovo su samo neki poznatiji tip provajderi a pored postojećih programer može napraviti svoj tip provajder.

Takođe, F# ima kvalitetne alate za analizu i procesiranje podataka kao što je -{Deedle}- i R tip provajder.
Počev od verzije 3.0 F# ima mogućnost kreiranja -{LINQ}- upita. Oni zajedno sa tip provajderima omogućavaju programiranje bogato informacijama. Na primer:

      -{open Microsoft.FSharp.Data.TypeProviders}-
      
      -{type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc">}-
      
      -{let podaci = Northwind.GetDataContext()}-
      
      -{let upit1 = upit { for korisnik in podaci.Korisnik do select korisnik }}-

Agent programiranje 

F# podržava varijantu programskog modela -{Actor}- kroz -{"in-memory"}- implementaciju lakih asinhronih agenata. Na primer naredni kod definiše agenta i ispisuje dve poruke:
      #upozorenje "100"
      let AgentStampanja = MailboxProcessor.Start(fun inbox-> 
        let rec porukaUPetlji = async{
        // čitamo poruku
        let! poruka = inbox.Receive()
        // ispisuje poruku
        printfn "poruka je: %s" poruka
        // vraća na početak
        return! porukaUPetlji  
        }
       // pokrećemo petlju 
       porukaUPetlji 
       )

Razvojni alati 

Vizuelni F# alati iz -{Microsoft-a}- uključuju kompletnu -{IDE}- integraciju u -{Visual Studio}--u. U -{Visual Studio-u}- se mogu napraviti F# projekti i -{Visual Studio}- debager može biti korišćen za debagovanje F# koda. Takođe, -{Visual F# studio}- dolazi sa -{Visual Studio REPL}- interaktivnom konzolom koja može biti korišćena da izvrši F# kod kako je napisan.

F# kod može se pisati u bilo kom tekstualnom editoru a neki editori kao što je -{Emacs}- imaju specifičnu podršku za F#.

 -{MonoDevelop}- je integrisano razvojno okruženje koje podržava F# programiranje na -{Linux-u}-, -{Mac-u}- i -{Windows-u}- uključujući podršku za interaktivnu konzolu koju koristi -{Visual Studio}-.

 -{WebSharper}- je platforma koja omogučava programiranje kompleksnih -{JavaScript}- i -{HTML}- aplikacija u F# jeziku.

 -{LINQPad}- podržava F# od verzije 2.0.

 -{SharpDevelop}- podržava F# od verzije 3.0

 -{Xamarin Studio}- podržava F# od verzije 3.0.

Oblast primene 

F# je programski jezik opšte namene, tj. napravljen je za pravljenje softvera u raznim domenima. F# posebno dolazi do izražaja kada je potrebna intenzivna analiza podataka, u paralelnom programiranju, naučnom programiranju u smislu matematičke i statističke kalkulacije i u aplikacijama gde postoje procesi koji se dugo izvršavaju. Podržan je i od strane otvorenih zajednica ali i od strane vodećih industrijskih kompanija koje daju profesionalne alate. F# je Tjuring-kompletan programski jezik.

Veb programiranje 

F# je centralni deo -{WebSharper}- platforme gde se F# kod izvršava kao -{.NET}- kod na serveru i kao -{JavaScript}- kod na klijentovoj strani.
Ostale poznatije platforme za veb aplikacije su:

 -{suave.io}-
 -{nancyFx}-
 -{freya}-
 -{frank}-
 -{F# ASP.NET MVC}-

Skript programiranje 

F# pokriva različite domene. U njemu možemo pisati različite stilove programiranja pa je tako F# jako dobro opremljen i za skript programiranje. Zato ga programeri često koriste kao skript jezik, pre svega za -{REPL}- skript jezik.
F# skript fajl je klasičan F# izvorni kod. Razlika je u tome što ekstenzija .fsx ima neke dodatne mogućnosti. Fajlovi sa ekstenzijom -{.fsx}- kao i -{.fssscript}- se procesiraju gotovo isto kao i fajlovi sa ekstenzijom -{.fs}-. Jedine razlike su u tome što je simbol uslovne kompilacije definisan kao -{interactive}- umesto -{compiled}-, asembler

     FSharp.Compiler.Interactive.Settings.dll 

je podrazumevano naveden i

     Microsoft.FSharp.Compiler.Interactive.Settings

je podrazumevano otvoren.

Analitičko programiranje 

Između ostalog, F# se koristi za finansijsko programiranje, u trgovini energije, optimizaciji portfolia, mašinskom učenju, poslovnoj inteligenciji i u programiranju igrica na -{Facebook-u}-.
Podržavajući funkcionalno programiranje i posedovanjem velikih mogućnosti oko analize podataka, F# je veoma pogodan za matematičke programe jer se matematički jezik predstavlja u njemu na jednostavan način. F# ima i podršku za

 -{Excel}-
 -{R}-
 -{Python}-
 -{MATLAB}-
 -{Mathematica}-
pa zajedno sa jako moćnim bibliotekama koje poseduje je jako pogodan u pravljenje raznih naučnih programa.

Poslednjih godina F# se pozicionirao kao optimizovana alternativa -{C#-a}-. F# je kompatibilan sa svim -{Microsoft-ovim}- proizvodima i to ga je učinilo jako popularnim među programerima. Mnogi programeri daju rešenja zasnovana na F# i koriste -{C# WCF}- Servise.

Otvorene zajednice 

F# otvorena zajednica uključuje F# softver fondaciju i F# otvorenu grupu na -{GitHub-u}-.
Neki od poznatijih otvorenih projekata su:

 -{FsCheck}-

 -{VCC}- (statički analizator -{C}- programa (od strane -{Microsoftovog}- istraživačkog tima))

 -{VSLab}- (okruženje u -{Visual Studio-u}-)

Kompatibilnost 

U F# se mogu kreirati dve vrste F# biblioteka. Prve su one koje su dizajnirane za korišćenje samo iz F#-a, a druge su one koje su dizajnirne za korišćenje iz bilo kog -{.NET}- jezika. Neke od ovih biblioteka mogu izgledati neobično u drugim -{.NET}- jezicima ali sa strane F#-a one su onakve kakve trebaju biti.

Bilo koja biblioteka koja se napiše u F# može se koristiti u bilo kom -{.NET}- jeziku. Kako bi se ta biblioteka prilagodila što bolje tom jeziku moraju se poštovati sledeća pravila:

 Koristiti potpis -{.fsi}- kako bi se sakrili detalji koje -{API}- od klijenta očekuje.
 Izbegavati javne funkcije koje vraćaju n-torke.
 Kada je moguće napisati definiciju tipa.
 Pažljivo kreirati potpise za klasaklase i interfejse jer veoma mala promena može napraviti veliku razliku.

Reference

Spoljašnje veze 
 Istraživanje programskog jezika F# i žašto ga koristiti
 Kratka biografija i osnovni koncepti programskog jezika F#
 F# na Microsoft Research-u
 Istorija programskog jezika F# i zahvalnice
 F# imperativno i objektno orijentisano programiranje
 Imperativno programiranje
 F# pregled jezika
 Skript programiranje u F#
 Ekspert F# 4.0
 Kompatibilnost u F#
 Naučno programiranje u F#
 F# za početnike

Funkcionalno programiranje
Višeplatformski softver
Slobodni softver
Funkcionalni programski jezici
Софтвер са Апач лиценцом