F# | |
---|---|
Jazyková třída |
multiparadigma : funkční , objektově orientovaný , zobecněný , imperativní programování |
Objevil se v | 2005 |
Autor | Výzkum společnosti Microsoft |
Vývojář | Microsoft a F Sharp Software Foundation [d] |
Přípona souboru | .fs, .fsi, .fsxnebo.fsscript |
Uvolnění | 6.0 ( 19. října 2021 ) |
Typový systém | přísný |
Byl ovlivněn | Cíl Caml , C# , Haskell |
Licence | Licence na software Apache |
webová stránka | fsharp.org |
OS | Multiplatformní software ( .NET Framework , Mono ) |
Mediální soubory na Wikimedia Commons |
F# (vyslovováno ef-sharp ) je multiparadigmatický programovací jazyk z rodiny jazyků .NET , který kromě imperativního ( procedurálního ) a objektově orientovaného programování podporuje funkcionální programování . Struktura F# je v mnoha ohledech podobná struktuře OCaml , s jediným rozdílem, že F# je implementováno nad knihovnami .NET a runtime . Jazyk vyvinul Don Syme z Microsoft Research v Cambridge a v současnosti je vyvíjen Microsoft Developer Division. F# se poměrně úzce integruje s vývojovým prostředím Visual Studio a je součástí distribuce Visual Studio 2010/2012/2013/2015/2017/2019/2022; kompilátory byly také vyvinuty pro Mac a Linux [1] .
Microsoft integroval vývojové prostředí F# do Visual Studia 2010 a novějších verzí.
4. listopadu 2010 byl pod licencí Apache License 2.0 [2] zveřejněn kód pro kompilátor F# a jeho základní knihovny .
Kód F# je typově bezpečný , často kompaktnější než podobný kód C# , kvůli odvození typu . F# má silné typování, zcela chybí implicitní převody typů, což zcela eliminuje chyby spojené s přetypováním.
Funkce, jako je generické programování a funkce vyššího řádu, umožňují psát abstraktní generické algoritmy , které manipulují s parametrizovanými datovými strukturami (např. pole , seznamy , grafy , stromy ).
V mnoha jazycích je většina hodnot proměnné. Například následující kód C++ xuloží hodnotu 3 do proměnné:
int x = 2 ; x ++ ;Naproti tomu v F# jsou všechny hodnoty ve výchozím nastavení konstanty. F# umožňuje proměnné, které vyžadují, abyste specificky označili hodnoty jako proměnlivé pomocí slova proměnlivé:
nechť x = 2 // neměnné nechť proměnlivé y = 2 // proměnná x <- 3 // chyba y <- 3 // Ok. y=3F# má také referenční typy a objekty, které mohou také obsahovat měnitelné hodnoty. Většina kódu jsou však čisté funkce , což zabraňuje mnoha chybám a usnadňuje ladění. Navíc je zjednodušena paralelizace programů. Díky tomu všemu se kód zřídka stává komplikovanějším než podobný kód v imperativním jazyce.
Jednou z hlavních myšlenek F# je zajistit, aby existující kód a typy ve funkčním programovacím jazyce byly snadno přístupné z jiných jazyků .NET. Programy F# se kompilují do sestavení CLR (soubory s příponami .exe a .dll), k jejich spuštění je však nutné kromě .NET Framework nainstalovat ještě runtime balíček.
Zajímavou funkcí (a rozdílem od OCaml ) je ovládání logického vnořování kódových konstrukcí odsazením libovolného počtu mezer (a pouze mezer). Znaky tabulátoru nejsou pro tento účel podporovány. To vede k neustálým diskusím na fórech zkušených vývojářů, kteří jsou zvyklí používat taby v jiných programovacích jazycích.
F# je kompilovaný programovací jazyk, který používá Common Intermediate Language (CIL) jako zprostředkující jazyk, stejně jako programy napsané v C# nebo VB.NET .
Spolu s kompilátorem F# (fsc) existuje také interpret F# (fsi), který interaktivně provádí kód F#.
Charakteristickým rysem kompilátoru F# a interpretu F# je schopnost zacházet s kódem dvěma různými způsoby - okamžitě (ve výchozím nastavení) a odloženým (programátor to musí výslovně specifikovat ve zdrojovém kódu). V případě okamžité interpretace jsou výrazy vyhodnoceny předem v okamžiku spuštění programu pro provádění, bez ohledu na to, zda jsou volány během provádění programu nebo ne. V tomto případě se výkon programu často snižuje a dochází k plýtvání systémovými prostředky (například pamětí). V případě líné interpretace kódu jsou výrazy vyhodnocovány až v okamžiku, kdy jsou přímo přístupné během provádění programu. To šetří program od výše uvedených nevýhod, ale snižuje předvídatelnost, pokud jde o množství a posloupnost využití zdrojů (čas procesoru, paměť, I/O zařízení atd.) v různých fázích provádění programu.
Syntaxe F# je založena na matematickém zápisu a programování je poněkud podobné algebře , díky čemuž je F# podobný Haskellu . Když například definujete nový typ, můžete určit, že proměnné tohoto typu budou „ celá čísla nebo řetězce “. Vypadá to takto:
typ myType = IntVal of int | StringVal řetězce _Důležitým příkladem takových typů je Option, který obsahuje buď hodnotu nějakého typu, nebo nic.
typ Možnost <a> = Žádná | _ _ Některé z aJedná se o standardní typ F# a často se používá v situacích, kdy výsledkem nějakého kódu (jako je vyhledávání v datové struktuře) je hodnota, která nemusí být vrácena.
Kód je také matematický zápis. Následující konstrukce je ekvivalentní f(x) = x + 1 v algebře:
nechť f x = x + 1F# funguje takto: typ „ f“ je „ int -> int“, to znamená, že funkce bere celé číslo jako vstup a vytváří celé číslo jako výstup.
F# vám umožňuje přístup ke všemu, co je v FCL . Syntaxe pro práci s knihovnami .NET je v tomto smyslu co nejblíže syntaxi jazyka C# . Jazykové funkce jsou patrné při použití celé řady funkcí F#. Například následující kód aplikuje funkci na prvky seznamu :
nechť rec map func lst = shodu lst s | [] -> [] | head :: tail -> func head :: map func tail nech myList = [ 1 ; 3 ; 5 ] nechť newList = mapa ( fun x -> x + 1 ) myList" newList" je nyní " [2;4;6]".
Analýza seznamu v této funkci se provádí pomocí další výkonné funkce porovnávání vzorů . Umožňuje vám specifikovat vzory, při shodě se vypočítávají odpovídající výskyty operátoru shody. První vzor "[]" znamená prázdný seznam. Druhým je seznam skládající se z prvního prvku a konce (což může být libovolný seznam, včetně prázdného). Ve druhém vzorku je hodnota head spojena s proměnnou head a hodnota tail s ocasem (názvy mohou být libovolné). Ukázka tedy kromě hlavního úkolu umožňuje také rozkládat složité datové struktury. Například v případě typu Option vypadá shoda vzorů takto:
shodu x s | Některé v -> printfn "Nalezená hodnota %d." v | Žádné -> printfn "Nic nebylo nalezeno." | Žádné -> printfn "Ahoj"Jazyk podporuje generátorové výrazy definované pro sady { … }, seznamy [ … ]a pole. [| … |] Například:
nechte test n = [ pro i v 0 .. n proveďte , pokud i % 2 = 0 pak získáte i ]Mapová funkce je jednou ze standardních seznamových funkcí obsažených v modulu Seznam. Existují také funkce pro další datové struktury deklarované v modulech Array, Set, Option.
Užitečným nástrojem je operátor pipe-forward (|>), který umožňuje psát řetězce volání funkcí v opačném pořadí. Výsledkem je následující kód (střední hodnoty jsou uvedeny v komentářích):
[ 1 ; 2 ; 5 ] |> Seznam . mapa ((+) 1 ) // [2; 3; 6] |> Seznam . filtr ( fun x -> x % 2 = 0 ) // [2; 6] |> Seznam . součet // 8Použití operátoru |>eliminuje potřebu velkého počtu závorek a také mění vizuální vnímání kódu. A nyní tento kód zní takto: vezměte takový a takový seznam, přidejte 1 ke každému prvku, pak nechte pouze sudé prvky, vraťte jejich součet. To znamená, že popisuje sekvenci akcí prováděných s původním objektem v pořadí, v jakém se vyskytují v počítači.
Následuje malá ukázka toho, jak funkce .NET rozšiřují F#. Jedním příkladem jsou aplikace v okně a zpracování událostí. Zpracování událostí znamená, že k některým akcím v programu dochází pouze jako reakce na určité události – akce uživatele, připojení zařízení atd. Projekt lze vytvořit jak ve Visual Studiu, tak v libovolném textovém dokumentu, který je následně přiveden do F# kompilátoru ( fsc).
// open - spojující moduly a jmenné prostory pro použití // hodnot, tříd a dalších modulů v nich obsažených. open System.Windows.Forms // - třídy Form (okno), Button (tlačítko) atd. // Beep - zvukový signál // Některé další parametry jsou předány jako argumenty beep, které nepoužíváme let beep _ = System . Konzole . Beep () // vytvořit okno programově pojmenované window !potřeba zavolat funkci display word - např. Application.Run(window)! // Visible - logická hodnota, zda je okno viditelné // TopMost - zda je okno zobrazeno v popředí (pořadí oken se stejnou hodnotou v opačném pořadí volání) // Text - text okna title let window = nové okno formuláře ( Visible = true , TopMost = true , Text = "" , Top = 0 , Left = 0 , Height = 512 , Width = 768 ) . WindowState <- FormWindowState . Normální // Normální (, minimalizované, maximalizované) okno. Jen není zahrnuto v konstruktoru oken pro příklad . ClientSizeChanged . Přidat zvukové okno . _ keydown . Přidat zvukové okno . _ stisknutí klávesy . Přidat zvukové okno . _ klíčování . Přidat aplikaci pípnutí . Spustit okno // zobrazit oknoRekurzivní faktoriální funkce nativním způsobem:
nechť rec fac n = pokud n < 2 pak 1 jinak n * fac ( n - 1 )Rekurzivní faktoriální funkce optimalizovaná pro rekurzi ocasu.
nech faktoriál num = nech rec fac num acc = shodu num s | x když x < 2 -> acc |_ -> fac ( num - 1 ) ( acc * num ) fac num 1Faktoriální funkce v imperativním stylu s proměnlivým stavem.
nechť faktoriál num = if num < 2 then 1 else ať mutable fac = 1 for i in [ 2 .. num ] do fac <- fac * i facFaktoriální funkce pomocí skládání seznamu a násobení curried:
nechť fac n = Seznam . fold (*) 1 [ 1 .. n ]Rekurzivní funkce pro výpočet Fibonacciho čísel pomocí metody porovnávání vzorů:
nechť rec fib n a b = odpovídá n s | 0 -> a | 1 -> b | _ -> fib ( n - 1 ) b ( a + b )
Programovací jazyky | |
---|---|
|
.SÍŤ | |
---|---|
Implementace | |
Architektura | |
Infrastruktura | |
jazyky Microsoft | |
Jiné jazyky | |
Základy Windows | |
Komponenty | |
Srovnání |
|
Budoucí technologie | |
Informační zdroje |
Microsoft Research (MSR) | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Hlavní projekty |
| ||||||||||||||
Laboratoře MSR |
| ||||||||||||||
Kategorie |
Bezplatný a otevřený software společnosti Microsoft | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
obecná informace |
| ||||||||||||
Software _ |
| ||||||||||||
licence | |||||||||||||
související témata |
| ||||||||||||
Kategorie |