ñòàòüèGNU Free Documentation License ìàòåðèàëû âçÿòû èç Âèêèïåäèè Ñòàòüÿ áûëà èçìåíåíà. Îðèãèíàë ñòàòüè.

F Sharp

Ìàòåðèàë èç Ýíöèêëîïåäèè â ñâîáîäíîé ýíöèêëîïåäèè
Ïåðåéòè ê: íàâèãàöèÿ, ïîèñê
Ïðàâèëüíûé çàãîëîâîê ýòîé ñòàòüè â F#. Îí ïîêàçàí íåêîððåêòíî èç-çà òåõíè÷åñêèõ îãðàíè÷åíèé.
F#
Êëàññ ÿçûêà:

ìóëüòèïàðàäèãìåííûé: ôóíêöèîíàëüíîå, îáúåêòíî-îðèåíòèðîâàííîå, îáîáù¸ííîå, èìïåðàòèâíîå ïðîãðàììèðîâàíèå

Ïîÿâèëñÿ â:

2002

Àâòîð(û):

Microsoft Research

Ðåëèç:

2.0 (12 àïðåëÿ 2010)

Òèïèçàöèÿ äàííûõ:

ñòðîãàÿ

Èñïûòàë âëèÿíèå:

Objective Caml, C#, Haskell

Ëèöåíçèÿ

Apache Software License

Ñàéò:

Microsoft F# Developer Center

F# (ïðîèçíîñèòñÿ ýô-øàðï) â ýòî ôóíêöèîíàëüíûé ÿçûê ïðîãðàììèðîâàíèÿ èç ñåìåéñòâà ÿçûêîâ .NET Framework, ïîääåðæèâàþùèé ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå â äîïîëíåíèå ê èìïåðàòèâíîìó (ïðîöåäóðíîìó) è îáúåêòíî-îðèåíòèðîâàííîìó ïðîãðàììèðîâàíèþ. Ñòðóêòóðà F# âî ìíîãîì ñõîæà ñî ñòðóêòóðîé OCaml ñ òîé ëèøü ðàçíèöåé, ÷òî F# ðåàëèçîâàí ïîâåðõ áèáëèîòåê è ñðåäû èñïîëíåíèÿ .NET. ßçûê áûë ðàçðàáîòàí Äîíîì Ñàéìîì (àíãë. Don Syme) â Microsoft Research â Êåìáðèäæå, â íàñòîÿùåå âðåìÿ åãî ðàçðàáîòêó âåäåò Microsoft Developer Division. F# äîñòàòî÷íî òåñíî èíòåãðèðóåòñÿ ñî ñðåäîé ðàçðàáîòêè Visual Studio è âêëþ÷¸í â ïîñòàâêó Visual Studio 2010; ðàçðàáîòàíû òàêæå êîìïèëÿòîðû äëÿ Mac è Linux[1].


Íåêîòîðûå çàäà÷è ðåøàþòñÿ çíà÷èòåëüíî ïðîùå è ÿñíåå ñ èñïîëüçîâàíèåì F# (ïî ñðàâíåíèþ ñ ðåøåíèÿìè íà äîìèíèðóþùèõ ÎÎ-ÿçûêàõ), îñîáåííî òå, ÷òî èñïîëüçóþò ìàòåìàòè÷åñêèé ñòèëü ïðîãðàììèðîâàíèÿ. Íàïðèìåð, íàïèñàíèå êîìïèëÿòîðà òðåáóåò ðàáîòû ñî ñòðóêòóðàìè äàííûõ è ïðåîáðàçîâàíèé íàä íèìè.

Microsoft èíòåãðèðîâàëà ñðåäó ðàçðàáîòêè F# â Visual Studio 2010. Êîìïàíèÿ ïëàíèðóåò àêòèâíî âíåäðÿòü äàííûé ÿçûê â ðàçðàáîòêó ïðîãðàììíûõ ñèñòåì, êîòîðûå ñàìè ñ òå÷åíèåì âðåìåíè ñìîãóò ìàñøòàáèðîâàòüñÿ, íàïðèìåð, â çàâèñèìîñòè îò êîëè÷åñòâà ïîëüçîâàòåëåé. Äàííîå äîñòîèíñòâî íåïðîñòî ðåàëèçîâàòü â èìïåðàòèâíûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ.

4 íîÿáðÿ 2010 ãîäà êîä êîìïèëÿòîðà F# è îñíîâíûõ áèáëèîòåê ê íåìó îïóáëèêîâàí ïîä Apache License 2.0[2].

Ñîäåðæàíèå

[ïðàâèòü] Îñîáåííîñòè

Êîä íà ÿçûêå F# ÿâëÿåòñÿ áåçîïàñíûì â îòíîøåíèè òèïîâ, ÷àñòî áûâàåò áîëåå êîìïàêòíûì, ÷åì àíàëîãè÷íûé êîä C#, çà ñ÷¸ò âûâîäà òèïîâ.

Òàêèå âîçìîæíîñòè, êàê îáîáùåííîå ïðîãðàììèðîâàíèå è ôóíêöèè âûñøèõ ïîðÿäêîâ ïîçâîëÿþò ïèñàòü àáñòðàêòíûå îáîáùåííûå àëãîðèòìû, êîòîðûå óïðàâëÿþò ïàðàìåòðèçîâàííûìè ñòðóêòóðàìè äàííûõ (íàïðèìåð, ìàññèâàìè, ñïèñêàìè, ãðàôàìè, äåðåâüÿìè).

Îäíà èç îñíîâíûõ èäåé F# çàêëþ÷àåòñÿ â òîì, ÷òîáû óäîñòîâåðèòüñÿ, ÷òî èìåþùèéñÿ êîä è òèïû â ôóíêöèîíàëüíîì ÿçûêå ïðîãðàììèðîâàíèÿ ìîãóò áûòü ëåãêî äîñòóïíû èç äðóãèõ .NET-ÿçûêîâ. Ïðîãðàììû íà F# êîìïèëèðóþòñÿ â ñáîðêè CLR (ôàéëû ñ ðàñøèðåíèÿìè .exe è .dll), îäíàêî, äëÿ èõ çàïóñêà íåîáõîäèìà óñòàíîâêà ïàêåòà ñðåäû èñïîëíåíèÿ äîïîëíèòåëüíî ê .NET Framework.

[ïðàâèòü] Êîìïèëÿòîð è èíòåðïðåòàòîð

F# â êîìïèëèðóåìûé ÿçûê ïðîãðàììèðîâàíèÿ, ïðè ýòîì â êà÷åñòâå ïðîìåæóòî÷íîãî ÿçûêà èñïîëüçóåòñÿ ÿçûê Common Intermediate Language (CIL), òàê æå êàê è â ïðîãðàììàõ, íàïèñàííûõ íà ÿçûêàõ C# èëè VB.NET.

Íàðÿäó ñ F#-êîìïèëÿòîðîì (fsc) ïðèñóòñòâóåò è F#-èíòåðïðåòàòîð (fsi), êîòîðûé èñïîëíÿåò F#-êîä èíòåðàêòèâíî.

[ïðàâèòü] Ïðèìåðû

Ñèíòàêñèñ F# ïîñòðîåí íà ìàòåìàòè÷åñêîé íîòàöèè, à ïðîãðàììèðîâàíèå ÷åì-òî ïîõîæå íà àëãåáðó, ÷òî äåëàåò F# ïîõîæèì íà Haskell. Íàïðèìåð, êîãäà âû îïðåäåëÿåòå íîâûé òèï, òî ìîæåòå óêàçàòü, ÷òî ïåðåìåííûìè ýòîãî òèïà áóäóò «öåëûå èëè ñòðîêè». Âîò êàê ýòî âûãëÿäèò:

type myType = IntVal of int | StringVal of string

Êîä òàêæå ïðåäñòàâëÿåò ñîáîé ìàòåìàòè÷åñêóþ íîòàöèþ. Ñëåäóþùàÿ êîíñòðóêöèÿ ýêâèâàëåíòíà f(x) = x + 1 â àëãåáðå:

let f x = x + 1

F# ðàáîòàåò ñëåäóþùèì îáðàçîì: òèï «f» ïðåäñòàâëÿåò ñîáîé «int -> int», òî åñòü ôóíêöèÿ ïîëó÷àåò íà âõîä öåëîå è âûäà¸ò íà âûõîä öåëîå.

F# ïîçâîëÿåò ïîëó÷èòü äîñòóï àáñîëþòíî êî âñåìó, ÷òî åñòü â FCL. Ñèíòàêñèñ äëÿ ðàáîòû ñ áèáëèîòåêàìè .NET â ýòîì ñìûñëå ìàêñèìàëüíî áëèçîê ê ñèíòàêñèñó C#. Îñîáåííîñòè ÿçûêà çàìåòíû ïðè èñïîëüçîâàíèè âñåãî ñïåêòðà âîçìîæíîñòåé F#. Ê ïðèìåðó, ñëåäóþùèé êîä ïðèìåíÿåò ôóíêöèþ ê ýëåìåíòàì ñïèñêà:

 let rec map func lst =
     match lst with
        | [] -> []
        | head :: tail -> func head :: map func tail
 
 let myList = [1;3;5]
 let newList = map (fun x -> x + 1) myList

 «newList» òåïåðü íàõîäèòñÿ «[2;4;6]».

Ðàçáîð ñïèñêà â ýòîé ôóíêöèè âåä¸òñÿ ñ ïîìîùüþ åù¸ îäíîé ìîùíîé âîçìîæíîñòè ñîïîñòàâëåíèÿ ñ îáðàçöîì. Îíà ïîçâîëÿåò çàäàâàòü îáðàçöû ïðè ñîâïàäåíèè ñ êîòîðûìè âû÷èñëÿþòñÿ ñîîòâåòñòâóþùèå âõîæäåíèÿ îïåðàòîðà match. Ïåðâûé îáðàçåö «[]» îçíà÷àåò ïóñòîé ñïèñîê. Âòîðîé â ñïèñîê ñîñòîÿùèé èç ïåðâîãî ýëåìåíòà è õâîñòà (êîòîðûé ìîæåò áûòü ïðîèçâîëüíûì ñïèñêîì, â òîì ÷èñëå è ïóñòûì). Âî âòîðîì îáðàçöå çíà÷åíèå ãîëîâû ñâÿçûâàåòñÿ ñ ïåðåìåííîé head, à õâîñòà ñ tail (èìåíà ìîãóò áûòü ïðîèçâîëüíûå). Òàêèì îáðàçîì êðîìå îñíîâíîé çàäà÷è îáðàçåö åù¸ ïîçâîëÿåò ïðîèçâîäèòü äåêîìïîçèöèþ ñëîæíûõ ñòðóêòóð äàííûõ.

Ñîáûòèÿ: â îòêëèê âàøåé ïðîãðàììû íà äåéñòâèÿ ïîëüçîâàòåëåé, ïîäêëþ÷åíèå óñòðîéñòâ è òä.

VisualStudio 2010 âåðñèè 10.0.30319.1 
Framework âåðñèè 4.30319

Äîáàâèòü â ññûëêè ïðîåêòà áèáëèîòåêè:
System
System.Drawing
System.Windows.Forms

 ñâîéñòâàõ ïðîåêòà âûáðàòü òèï âûõîäíûõ äàííûõ:
Windows-ïðèëîæåíèå

Êîä ïðîãðàììû ðàáî÷èé, íåçàêîí÷åííûé (ìîæåò áûòü ñêîïèðîâàí) (Ôàéëû â ïðîåêòå *.fs)

 // open - ïîäêëþ÷åíèå ññûëîê áèáëèîòåê äëÿ èñïîëüçîâàíèÿ ñîäåðæàùèõñÿ â íèõ:
 // ñëîâ-ôóíêöèé - ê ïðèìåðó '''open''', '''len''' è òä;
 // ñïèñêîâ - ê ïðèìåðó Keys è òä;
 // çíà÷åíèé - ê ïðèìåðó Keys.A=65 Keys.B=66 è òä; è òä.
 open System // - 
 open System.Drawing // - îáðàáîòêà îòðèñîâêè îêîí, ñëîâà-ôóíöèè ìåòîäîâ ðèñîâàíèÿ è òä.
 open System.Windows.Forms // - ñëîâà-ôóíöèè Form (îêíî), Button (êíîïêà)è òä.
 // let - 
 // evArgs - 
 // Beep - çâóêîâîé ñèãíàë
 // îêíî_èçìåíåíèå_ðàçìåðîâ - ñëîâî-ôóíêöèÿ, äåéñòâèå Beep
 let îêíî_èçìåíåíèå_ðàçìåðîâ evArgs = System.Console.Beep( )
 let îêíî_íàæàòèå_êëàâèø evArgs = System.Console.Beep( )
 let îêíî_óäåðæàíèå_êëàâèø evArgs = System.Console.Beep( )
 let îêíî_îòæàòèå_êëàâèø evArgs = System.Console.Beep( )
 // ñîçäàíèå îêíà ñ ïðîãðàìíûì èìåíåì îêíî !íåîáõîäèìî âûçûâàòü ñëîâî-ôóíêöèþ îòîáðàæåíèÿ - ê ïðèìåðó Application.Run(îêíî)!
 // Visible - âèäèìîñòü (true-false)
 // TopMost - îêíî íà ïåðåäíèé ïëàí â ïðîãðàììå(true-false) (î÷åð¸äíîñòü îêîí ñ îäèíàêîâûì çíà÷åíèåì â îáðàòíîì ïîðÿäêå âûçîâà)
 // Text - òåêñò çàãîëîâêà
 let îêíî = new System.Windows.Forms.Form(Visible=true,TopMost=true,Text="") 
 îêíî.Top<-0 // Âåðõíèé êðàé îêíà=0
 îêíî.Left<-0 // Ëåâûé êðàé îêíà=0
 îêíî.Height<-512 // Âûñîòà îêíà=512
 îêíî.Width<-768 // Øèðèíà îêíà=768
 îêíî.WindowState<-FormWindowState.Normal // Íîðìàëüíîå (,Ñâ¸ðíóòîå ,Ðàçâ¸ðíóòîå) îêíî
 îêíî.ClientSizeChanged.Add(îêíî_èçìåíåíèå_ðàçìåðîâ)
 îêíî.KeyDown.Add(îêíî_íàæàòèå_êëàâèø)
 îêíî.KeyPress.Add(îêíî_óäåðæàíèå_êëàâèø)
 îêíî.KeyUp.Add(îêíî_îòæàòèå_êëàâèø)
 Application.Run(îêíî) // îòîáðàæåíèå îêíà

[ïðàâèòü] Ïðèìå÷àíèÿ

[ïðàâèòü] Ñì. òàêæå

[ïðàâèòü] Ññûëêè

[ïðàâèòü] Ëèòåðàòóðà

  • Êðèñ Ñìèò (Smith, Chris) Ïðîãðàììèðîâàíèå íà F# = Programming F#. â O'Reilly, 2009.
  • Äìèòðèé Ñîøíèêîâ Ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå íà F#. â Ìîñêâà: ÄÌÊ Ïðåññ, 2011. â Ñ. 192. â ISBN 978-5-94074-689-8
  • Syme, Don; Granicz, Adam; Cisternino, Antonio Expert F#. â Apress, 2007. (àíãë.)
Ïðîñòðàíñòâà èì¸í

Âàðèàíòû
Äåéñòâèÿ