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