F# је строго типизиран програмски језик са отвореним (open-source) кодом под OSI-approved Apache 2.0 лиценцом и првокласни језик у програмском окружењу Визуелног Студиа.[1] Развијен је као .NET имплементација језгра програмског језика OCalm[2] под утицајем програмских језика C#, Python, Haskell, Scala и Erlang.[3] Ово је програмски језик са израженим функционалним карактеристикама, али подржава и друге програмске парадигме попут императивне и објектно-оријентисане.[4]

F#
Оригинални називF#
Изговара сеФи шарп
Појавио се2005.
Аутор(и)Don Syme
Дизајнер(и)Microsoft Research, Don Syme
Актуелна верзија4.0.1.20
УтицајиML, OCaml, C#, Python, Haskell, Scala, Erlang
Утицао наC#, Elm, F*, LiveScript
Оперативни системиCross-platform (.NET Framework, Mono, JavaScript)
ЛиценцаApache лиценца
Веб-сајтфсхарп.орг

F# је изражајан и концизан.[1] Служи за писање једноставних кодова који ће решавати комплексне проблеме.[1] Из пословне перспективе, главна улога F#-а је да смањи време потребно за реализацију аналитичких софтверских компоненти у савременом предузећу.[1] Снага F#-а лежи у сведеној синтакси која омогућава лаку читљивост кода, као и ефикасан развој програма који захтевају примену сложених математичких алгоритама.[4] Омогућава брзо генералисање прототипова као и њихову брзу трансформацију у продуктивни код.[4] Омогућава да програмери директније спроводе своје алгоритме (мање кода за читање и одржавање, као и брза играда прототипова). Коришћењем програмског језика F# као основног језика могу се лако креирати доменско специфични језици (DSL) што га чини погодним за научно – истраживачке примене.[4] Студије случаја и пријаве корисника показују да строга типизираност програмског језика F# смањује софтверске грешке.[1]

Код написан у језику F# можемо лако паралелизовати, што је веома значајно код рачунара са више језгара.[4] F# поседује медерну just-in-time (JIT) компилацију до изворног кода.[1] Брзина извршавања резултујућег кода је много већа но код језика као што су Python, JavaScript или R, а у појединим случајевима значајно бржа од програмског језика C#.[1] Користећи F# интерактивно, код се може одмах извршити без првог компајлирања, што омогућава течније истраживање проблема. Програмери могу користити F# интерактивно како би итеративно побошали алгоритме.[1] Код ће се извршавати и на 32-битном и на 64-битним системима уз коришћење упуства за одговарајуце архитектуре.[1]

F# можемо користити на Mac OS X, Linux, Android, HTML5 и осталим платформама.[1] Он је компатибилан са свим осталим .NET језицима, што значи да F# програм може да користи све .NET библиотеке.[4] Библиотека написана у F#-у може се користити у било којој Desktop или Web апликацији развијеној на .NET платформи.[4]

Историјски развој

уреди

Верзије

уреди

F# је прошао кроз неколико верзија током свог развоја.

Верзија Спецификација језика Датум Платформе Извршавања Развојни алати
F# 1.x мај, 2005[5] Windows .NET 1.0 - 3.5 Visual Studio 2005,Emacs
F# 2.0 август, 2010 април, 2010[6] Linux, OS X, Windows .NET 2.0 - 4.0 Mono
F# 3.0 новембар, 2012 август, 2012[7] Linux, OS X, Windows
JavaScript,[8] GPU[9]
.NET 2.0 - 4.5, Mono Visual Studio 2012, Emacs
WebSharper
F# 3.1 новембар, 2013 октобар, 2013[10] Linux, OS X, Windows
JavaScript,[8] GPU[9]
.NET 2.0 - 4.5, Mono Visual Studio 2013, Xamarin Studio
Emacs, MonoDevelop
SharpDevelop, WebSharper
CloudSharper
F# 4.0 јануар, 2016 јули, 2015[11] Visual Studio 2015

Еволуција језика

уреди

Програмски језик F# је првобитно дизајнирао и имплементирао Don Syme из Microsoft Research-а.[2] Затим је James Margetson приступио тиму Microsoft Research и остварио велики допринос у развоју овог програмског језика.[2] F# је повезан са дизајном генерика за .NET.[2] Andrew Kennedy је био ко-дизајнер генерика и Units-of-mentions (јединица мере) за F#.[2] Mads Torgorsen и Raj Pai су били одговорни за поставлајње иницијалног терена за стварање Visual F# и Microsoft Developer Division.[2]

Резиме верзија
F# 1.0 F# 2.0 F# 3.0[12] F# 3.1[13] F# 4.0[14]
Карактеристике
  • Функционално програмирање
  • Дискриминишуће уније (енгл. Discriminated unions)
  • Слогови (енгл. Records)
  • Торке
  • Преклапање образаца
  • Типске скраћенице
  • Објектно програмирање
  • Структуре
  • Потпис фајлова
  • Скрипт фајлови
  • Императивно програмирање
  • Модули (без функтора)
  • Угњеждени модули
  • .NET Интероперабилност
  • Активни обрасци
  • Јединице мере
  • Секвенцијални изрази
  • Асинхроно програмирање
  • Агент програмирање
  • Проширења у виду чланова
  • Именовање аргумената
  • Опциони аргументи
  • Сечење низова
  • Цитати
  • Природна интероперабилност
  • Рачунски изрази
  • Компонента која обезбедјује типове, својства и метод
  • LINQ упитни изрази
  • CLI мутабилни атрибут
  • Троструко цитирани стрингови
  • Аутоматска својства
  • Обезбеђене јединице мере
  • Именовање поља уније
  • Проширења за сечење низова
  • Побољсања у систему за закљуцивање типова
  • Штампање вредности из уније
  • Обезбеђени non-null типови
  • Примарни конструктори као функције
  • Статички параметри за извршне методе
  • Printf интерполација
  • Проширена #if граматика
  • Подршка за "fixed"
  • Атрибут који означава репни позив
  • Вишеструко инстанцирање интерфејса
  • Опциони типови аргумената
  • Речници параметара

Функционално програмирање

уреди

F# је први стриктно функционални програмски језик који подржава закључивање типова. То значи да програмер не мора да декларише типове, него ће компилатор сам закључити тип током компилације. F# је језик заснован на изразима.[15] Свака наредба у F# укључујући и if наредбу, try изразе и петље, спаја се са изразима статичког типа. Функције и изрази који не враћају неку вредност имају повратни тип unit. F# користи кључну реч let да додели вредности промењивој.[15] На пример:

  let x=3+4 

додељује вредност 7 промењивој x.

Нови типови се дефинишу коистећи кључну реч type. За функционално програмирање F# подржава торке, рекорде, дискриминишуће уније, листе и опционе типове.[15]

Торка представља колекцију од n вредности, гдје је n≥0. Вредност n се зове арност торке. Тројка ће бити представљена као (A, B, C), гдје су A, B и C вредности евентуално различитих типова. Торка може бити кориштена само када је број вредности познат у време прављена торке и тај број остаје константан током извршења програма.[15]

Дискриминишућа унија представља тип података чија вредност може бити у складу са само једним од дефинисаних дискриминатора. У свом најједноставнијем облику дискриминатор представља једну вредност, а дискриминишућа унија скуп вредности. Тада тип дискриминишућа унија семантички подсећа на тип енумерација у програмском језику C#.[15]

Рекорд је тип у коме се чланови података именују као:

  {Ime:string; Godine:int}

Може бити креиран као:

  {Ime:”AB”; Godine:42}

Кључна реч with се користи да направи копију рекорда као на пример:

  {r with ime=”CD”}

Овим изразом се креира нови рекорд тако што се прво копира r, а затим мења вредност у пољу име (Претпостављамо да је рекорд креиран у претходном примеру именован са r).[15]

У F# постоји тип list и означава непромењиву повезану листу. Листа се представља користећи head::tail нотацију (:: је контра оператор) или као [item1; item2; item3]. Празну листу означавамо са [].[15]

Опциони тип је дискриминишућа унија са изборима Some(x) или None.[15]

F# подржава ламбда рачун. Све функције у F# су немутабилне. Функције могу бити прослеђене као агументи другим функцијама.[15]

Императивно програмирање

уреди

Под императивним програмирањем се подразумева писање програма, који током извршавања више пута уписују податке на исту меморијску локацију. У програмским језицима, као што су C++, C# или Visual Basic то је потпуно уобичајно. Насупрот томе, наредба let у F#-у приликом сваког повезивања вредности са идентификатором уписује вредност у нову меморијску локацију. Наравно, понекад постоји потреба да се и у F# програмима пише императивни код. То је углавном случај кад се постојећи, сложени алгоритми, са неког императивног програмског језика преносе у F#.[16][17]

Синтакса програмског језика F# разликује три врсте променљивих структура, и то:

  • Локалне променљиве
  • Референце
  • Слогове са променљивим пољима[17]

Локалне променљиве

уреди

Локалне променљиве дефинишу се тако што се после наредбе повезивања let употребљава кључна реч mutable. Промена локалне променљиве врши се помоћу оператора стрелица улево (<-). Локалне променљиве имају одређена ограничења, а најзначајније од њих је да се могу користити само у сопственој области дефинисаности ( нпр. приликом враћања локалне променљиве из функције не враћа се сама локална променљива, него копија њене вредности).[17]

Референце

уреди

Референца представља објектни омотач (ћелију) у којој је смештена вредност која се може мењати током извршавања програма. Вредност се смешта у референцу применом функције ref. Садржају референце приступа се помоћу оператора (!), док се за измену садржаја користи оператор (:=).[17]

Слогови са променљивим пољима

уреди

Синтакса програмског језика F# омогућава дефинисање слогова са променљивим пољима. Променљива поља дефинишу се писањем кључне речи mutable испред назива поља.[17]

Низови

уреди

Низ (енгл. array) је колекција променљивих елемената истог типа. Имплеметација низа је таква да су елементи који га чине смештени у меморији непосредно један после другог.[16] Због тога је при декларацији низа потребно тачно знати колико ће елемената бити у низу. Предност овакве имплементације је у томе што омогућава ефикасан приступ произвољном елементу низа.[16] Низови се могу креирати помоћу генераторских израза, попут листа и секвенци или задати као листа вредности одвојених знаком ; између знакова [| и |]. На пример:

  let arr = [| 1.0 ; 2.0; 3.0 |] 

Елементима низа приступа се помоћу оператора индексирања (.[]) . Оператор индексирања употребљава се како код читања тако и код мењања садржаја елемента низа.[16], на пример:

  arr.[1]<-5

уписује вредност 5 на позицију 1.

Петље

уреди

Императивно програмирање подразумева експлицитну контролу тока извршавања програма. Таква контрола подразумева и употребу петљи које омогућавају репетативно извршавање одређеног дела кода одређени број пута, односно до испуњења датог услова. Програмски језик F# подржава while петљу и две врсте for петље.[17]

While петља

уреди

While петља се извршава све док услов циклуса враћа логичку вредност true.[17] Следећи пример илуструје примену while петље за израчунавање збира целих бројева од 1 од n.

  let mutable zbir = 0
  let mutable i=1
  while (i<=n) do
     zbir <- zbir + i
     i <- i + 1

For петља

уреди

For петља се користи када је унапред познат број итерација које треба да буду извршене.[17]

Једноставна форма for петље подразумева постојање целобројне циклусне променљиве (бројача) у заглављу петље, која узима вредности између доње и горње границе.[17] Следећи пример је еквивалентан претходном, само што је овај пут за решавање проблема употребљен једноставан облик for petlje.

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

Набројива форма for петље подразумева постојање циклусне променљиве која узима вредности редом из произвољне секвенце.[17] У примеру који следи, затворени интервал целих бројева задат је секвенцом у форми листе целих бројева од 1 до n.

  let mutable zbir = 0
  for i in [1, n] do
     zbir <- zbir + 1

Објектно оријентисано програмирање

уреди

Највећи део .NET платформе написан је у објектно оријентисаним програмским језицима, првенствено у програмском језицима C#. Зато је познавање објектно оријентисаног програмирања од кључне важности за коришћење бројних .NET библиотека. Објектно оријентисан стил програмирања погодан је за писање комплексних софтверских система. Наведена погодност се огледа у могућности да се објекти из реалног света моделују помоћу софтверских абстракција, класа.[16]

Класа је синтаксни елемент који повезује функције и податке. Синтакса програмског језика F# дефинише више елемената који се из објектно оријентисаних програмских језика виде као класе.[16] То су:

  • Слог
  • Унија дискриминатора
  • Изузетак
  • Класа
  • Модул

Пример дефинисања класе:

  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.)

Објекат класе Vektor2D креирамо навођењем имена класе и прослеђивањем вредности параметара потребних за иницијализацију објекта.

Својства служе за приступ подацима. Најчешће су то сирови подаци презентовани на начин како су дефинисани у пољима, али могу бити и израчунате вредности (нпр. својство duzina зависи од величине више поља).[16] Слично као и у другим објектно оријентисаним програмским језицима, својства могу припадати класи уместо појединим објектима дате класе. Таква својства називају се статичка, а у програмском коду означавају се помоћу кључне речи static:

  static member Nula = Vektor2D(0.,0.)

Статичка својства најчешће се користе за креирање специфичних објеката дате класе (нпр. нула вектор).[16]

Метода представља операцију коју је могуће извршити над објектом. Приликом дефинисања методе у заглављу се поред назива наводи и скуп параметара потребних за њено позивање. У примеру је дата метода pomnoziSkalarom koja prima parametar k tipa float и враћа Vektor2D објекат чије су димензије увећане k пута.

  member t.pomnoziSkalarom(k) = Vektor2D(k*dx,k*dy)

Иако је препоручљиво да F# класе буду непроменљиве, могуће је написати и класу која током извршења програма мења своје стање.[16] Дефинисање променљиве класе илустровано је на следећем примеру:

  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.)

Асинхроно програмирање

уреди

F# подржава асинхроно програмирање кроз асинхроне радне процесе почев од верзије 1.9.2.9.[18] Асинхрони процеси рада су једна апликација F#-ове синтаксе рачунања израза. Ово је један пример како би два асинхрона процеса рада могла да се извршавају паралелно:

   let task1 = async { return 10+10 }
   let task2 = async { return 20+20 }
   Async.Run (Async.Parallel [ task1; task2 ])

У наведеном примеру израз “async { return 10+10 }” креира један објекат типа Async<int>. Ове вредности нису прави резултати већ су специфичне за овај конкретан задатак. Израз “Async.Parallel [ task1; task2 ]” спаја два задатка и креира нови. Ово прави нову вредност типа Async<int[]>. Async.run добија ове вредности и покреће се како би вратио низ [| 20; 40 |].

Асинхрони радни процес је дефинисан као секвенца команди унутар "async" блока (Async{.....}), као у следећем примеру:

   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() }

Команда let! нам говори да израз са десне стране (req.GetResponseAsync()) треба да се уради асинхроно, али да нит треба да се настави само када је резултат доступан. Са гледишта блока кода, ово је као да добијање одговора блокира сам позив, док са гледишта система нит неће бити блокирана и може бити коришћена за обраду других нити док резултат потребан за њу не постане доступан. Асинхрони блок може бити позван коришћењем функције Async.RunSynchronously. Више "async" блокова могу да се изврше паралелно коришћењем функције Async.Parallel која узима листу "async" објеката (у наведеном примеру "asynctrack" је један "async" објекат) и прави нови "async" објекат како би извршила задатке из листе паралелно. Резултујући објекат се позива коришћењем функције "Async.RunSynchronously".[18] Инверзија контроле у F# прати овај образац.[18]

Паралелно програмирање

уреди

Паралелно програмирање је делимично подржано кроз "Async.Parallel", "Async.Start" и других операција које извршавају асинхроне блокове паралелно. Паралелно програмирање је такође подржано кроз "Аrray.Parallel", оператором функционалног програмирања из стандардне библиотеке F#, директном употребом System.Threading.Task, директном употребом .Net заједничких нити и .Net нити. Оне динамички преводе F# код на језике алтернативних машина које извршавају парелизацију. Један пример је GPU[19] код.

Јединице мере

уреди

F# је тип система који подржава провере бројева коришћењем јединица мера. Јединица мере је карактеристика која нам, заједно са типом закључивања система F#, омогућава да имамо минималан број коментара у нашем коду.[20] Подаци типа float или означеног int-a могу да имају себи придружене јединице мере, које се најчешће користе како би ближе описале тај појам, рецимо његову дужину, запремину или масу. Користећи ове ознаке ми омогућавамо компајлеру да утврди да ли операнти у насем изразу имају одговарајуће јединице мере, што помазе при спречавању грешака у програму. Синтакса је следећа:

   [<Measure>] type mera-ime [ = measure ]

У наведеном примеру смо дефинисали промењиву мера-име као јединицу мере. Опциони део се користи да дефинише мере за претходно дефинисане јединице. На пример можемо дефинисати меру у центиметрима или кубним центиметрима :

   [<Measure>] type cm
   [<Measure>] type ml = cm^3

У следећем примеру можемо видети још неке од постојећих јединица мера али и начин како да их конвертујемо из бездимензионих бројева у димензионе вредности.

  // 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


Мета-програмирање

уреди

F# омогућава неке форме персонализације синтаксе како би подржао уграђивање јединствених домен-специфичних језика унутар самог језика F#. F# такодје садржи одлику рун-тиме мета-програмирања под називом цитати[]. Израз овог типа се третира као израз абстрактне синтаксе која је репрезентација израза из F#. Дефиницији која је обележена са атрибутом "[<ReflectedDefinition>]" се такође мозе приступити у њеном цитатном облику. F# цитати се користе у разноврсне сврхе као сто је на пример компилација F# кода у JavaScritp[21] или GPU[19] код.


Програмирање богато информацијама

уреди

Од верзије Ф# 3.0 постоји облик програмирања кроз Ф# тип провајдера. То значи да од ове верзије Ф# компајлер може да компајлира различите изворе података као део програмирања језика система. Ово је од великог значаја програмерима јер они у тренутку писања кода добијају проверу синтаксних грешака.[22] Неки од типова провајдера који постоје су:

  • CSV фајлови ("Сирови" онлајн подаци се у великој мери чувају на овај начин.)
  • Слободна база (Интернет база података која сакупља информације са различитих извора. Иако се из овог типа провајдера тешко извлаче структуре података, користан је због разних других листи. Уколико је већа количина интернет саобраћаја са исте ИП адресе, слободна база ће на одређено време блокирати ту IP адресу.)
  • SQL сервер
  • Azure Marketplace (Погодан код претраге одређеног производа када корисник тачно зна у којој групи је тражени производ, чиме се претрага драстично сужава.)

Наравно, ово су само неки познатији тип провајдери а поред постојећих програмер може направити свој тип провајдер.[23]

Такође, Ф# има квалитетне алате за анализу и процесирање података као што је Deedle и Р тип провајдер.[23] Почев од верзије 3.0 Ф# има могућност креирања LINQ упита.[22] Они заједно са тип провајдерима омогућавају програмирање богато информацијама. На пример:


     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 }

Агент програмирање

уреди

Ф# подржава варијанту програмског модела Actor кроз "in-memory" имплементацију лаких асинхроних агената.[23] На пример наредни код дефинише агента и исписује две поруке:

     #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 
      )

Развојни алати

уреди

Визуелни Ф# алати из Microsoft-a укључују комплетну IDE интеграцију у Visual Studio-у. У Visual Studio-u се могу направити Ф# пројекти и Visual Studio дебагер може бити коришћен за дебаговање Ф# кода.[23] Такође, Visual F# studio долази са Visual Studio REPL интерактивном конзолом која може бити коришћена да изврши Ф# код како је написан.

Ф# код може се писати у било ком текстуалном едитору а неки едитори као што је Emacs имају специфичну подршку за Ф#[22].

  • MonoDevelop је интегрисано развојно окружење које подржава Ф# програмирање на Linux-u, Mac-u и Windows-u укључујући подршку за интерактивну конзолу коју користи Visual Studio.
  • WebSharper је платформа која омогучава програмирање комплексних JavaScript и HTML апликација у Ф# језику.
  • LINQPad подржава Ф# од верзије 2.0.

Област примене

уреди

Ф# је програмски језик опште намене, тј. направљен је за прављење софтвера у разним доменима. Ф# посебно долази до изражаја када је потребна интензивна анализа података, у паралелном програмирању, научном програмирању у смислу математичке и статистичке калкулације и у апликацијама где постоје процеси који се дуго извршавају.[24] Подржан је и од стране отворених заједница али и од стране водећих индустријских компанија које дају професионалне алате. Ф# је Тјуринг-комплетан програмски језик.

Веб програмирање

уреди

Ф# је централни део WebSharper платформе где се Ф# код извршава као .NET код на серверу и као JavaScript код на клијентовој страни.[22] Остале познатије платформе за веб апликације су:

  • suave.io
  • nancyFx
  • freya
  • frank
  • F# ASP.NET MVC

Скрипт програмирање

уреди

Ф# покрива различите домене. У њему можемо писати различите стилове програмирања па је тако Ф# јако добро опремљен и за скрипт програмирање. Зато га програмери често користе као скрипт језик, пре свега за REPL скрипт језик.[25] Ф# скрипт фајл је класичан Ф# изворни код. Разлика је у томе што екстензија .фсx има неке додатне могућности. Фајлови са екстензијом .fsx као и .fssscript се процесирају готово исто као и фајлови са екстензијом .fs. Једине разлике су у томе што је симбол условне компилације дефинисан као interactive уместо compiled, асемблер

    FSharp.Compiler.Interactive.Settings.dll 

је подразумевано наведен и

    Microsoft.FSharp.Compiler.Interactive.Settings

је подразумевано отворен.[22]

Аналитичко програмирање

уреди

Између осталог, Ф# се користи за финансијско програмирање, у трговини енергије, оптимизацији портфолиа, машинском учењу, пословној интелигенцији и у програмирању игрица на Facebook-u. Подржавајући функционално програмирање и поседовањем великих могућности око анализе података, Ф# је веома погодан за математичке програме јер се математички језик представља у њему на једноставан начин.[23] Ф# има и подршку за

па заједно са јако моћним библиотекама које поседује је јако погодан у прављење разних научних програма.

Последњих година Ф# се позиционирао као оптимизована алтернатива C#-a.[22] Ф# је компатибилан са свим Microsoft-ovim производима и то га је учинило јако популарним међу програмерима. Многи програмери дају решења заснована на Ф# и користе C# WCF Сервисе.

Отворене заједнице

уреди

Ф# отворена заједница укључује Ф# софтвер фондацију и Ф# отворену групу на GitHub-u. Неки од познатијих отворених пројеката су:

  • VCC (статички анализатор C програма (од стране Microsoftovog истраживачког тима))
  • VSLab (окружење у Visual Studio-u)

Компатибилност

уреди

У Ф# се могу креирати две врсте Ф# библиотека. Прве су оне које су дизајниране за коришћење само из Ф#-а, а друге су оне које су дизајнирне за коришћење из било ког .NET језика.[22] Неке од ових библиотека могу изгледати необично у другим .NET језицима али са стране Ф#-а оне су онакве какве требају бити.

Било која библиотека која се напише у Ф# може се користити у било ком .NET језику. Како би се та библиотека прилагодила што боље том језику морају се поштовати следећа правила:[23]

  • Користити потпис .fsi како би се сакрили детаљи које 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

уреди
  1. ^ а б в г д ђ е ж з и „Try F#: Explore[[Категорија:Ботовски наслови]]”. Архивирано из оригинала 19. 11. 2016. г. Приступљено 17. 11. 2016.  Сукоб URL—викивеза (помоћ)
  2. ^ а б в г д ђ „F# Historical Acknowledgements”. Приступљено 24. 11. 2012. 
  3. ^ [[F_Sharp_(programming_language)#cite_note-fsharposg-9|F Sharp (programming language) - Wikipedia]]
  4. ^ а б в г д ђ е Programski jezik F# | ediba94
  5. ^ Syme, Don. „F# 1.0.8 released”. Microsoft. Приступљено 7. 09. 2014. 
  6. ^ Syme, Don. „F# 2.0 released as part of Visual Studio 2010”. Microsoft. Приступљено 7. 09. 2014. 
  7. ^ Zander, Jason. „Visual Studio 2012 and .NET Framework 4.5 released to the web”. Microsoft. Приступљено 7. 09. 2014. 
  8. ^ а б The F# Software Foundation. „Using F# with HTML5 Web Applications”. Архивирано из оригинала 25. 06. 2014. г. Приступљено 07. 06. 2014. 
  9. ^ а б The F# Software Foundation. „Using F# for GPU Programming”. Архивирано из оригинала 18. 12. 2016. г. Приступљено 07. 06. 2014. 
  10. ^ „Visual Studio 2013 released to web”. Microsoft. Архивирано из оригинала 13. 01. 2014. г. Приступљено 7. 09. 2014. 
  11. ^ „Announcing the RTM of Visual F# 4.0”. Microsoft. Архивирано из оригинала 06. 09. 2015. г. Приступљено 15. 09. 2015. 
  12. ^ McNamara, Brian. „More About F# 3.0 Language Features”. Microsoft. Архивирано из оригинала 22. 07. 2012. г. Приступљено 7. 09. 2014. 
  13. ^ McNamara, Brian. „Announcing a pre-release of F# 3.1”. Microsoft. Архивирано из оригинала 07. 09. 2014. г. Приступљено 7. 09. 2014. 
  14. ^ Syme, Don. „Status of F# 4.0+ Approved Language/Library Items”. F# Language Evolution BDFL. Microsoft. Архивирано из оригинала 07. 09. 2014. г. Приступљено 7. 09. 2014. 
  15. ^ а б в г д ђ е ж з http://tomasp.net/articles/fsharp-i-introduction/article.pdf
  16. ^ а б в г д ђ е ж з F# Overview (III.) - Imperative and Object-Oriented Programming - Tomas Petricek
  17. ^ а б в г д ђ е ж з и 4. Imperative Programming - Programming F# 3.0, 2nd Edition [Book]
  18. ^ а б в Introducing F# Asynchronous Workflows – Don Syme's WebLog on F# and Related Topics
  19. ^ а б „Use F# for GPU Programming | The F# Software Foundation[[Категорија:Ботовски наслови]]”. Архивирано из оригинала 18. 12. 2016. г. Приступљено 17. 11. 2016.  Сукоб URL—викивеза (помоћ)
  20. ^ Units of Measure (F#)
  21. ^ „Using F# for HTML5 Web Applications | The F# Software Foundation[[Категорија:Ботовски наслови]]”. Архивирано из оригинала 25. 06. 2014. г. Приступљено 17. 11. 2016.  Сукоб URL—викивеза (помоћ)
  22. ^ а б в г д ђ е https://books.google.rs/books?id=XKhPCwAAQBAJ.  |first1= захтева |last1= у Authors list (помоћ); Недостаје или је празан параметар |title= (помоћ); Спољашња веза у |work= (помоћ); Недостаје или је празан параметар |url= (помоћ)
  23. ^ а б в г д ђ https://books.google.me/books?id=b_j2IkRTHUEC.  |first1= захтева |last1= у Authors list (помоћ); Недостаје или је празан параметар |title= (помоћ); Спољашња веза у |work= (помоћ); Недостаје или је празан параметар |url= (помоћ)
  24. ^ http://fsharp.org/guides/data-science/.  |first1= захтева |last1= у Authors list (помоћ); Недостаје или је празан параметар |title= (помоћ); Спољашња веза у |work= (помоћ); Недостаје или је празан параметар |url= (помоћ)
  25. ^ https://blogs.msdn.microsoft.com/chrsmith/2008/09/12/scripting-in-f/.  |first1= захтева |last1= у Authors list (помоћ); Недостаје или је празан параметар |title= (помоћ); Спољашња веза у |work= (помоћ); Недостаје или је празан параметар |url= (помоћ)

Spoljašnje veze

уреди