Názorný postup: Pomocí Visual F# vytvářet, ladit a zavést aplikaci
V tomto návodu se seznámíte se zkušenostmi s použitím jazyka F# v Visual Studio spolu s rozhraním .NET Framework 4.5.
V této příručce se prostřednictvím příkladu historické analýzy dat úrokové sazby státní pokladny Spojených států dozvíte, jak začít s pomocí Visual Studio psaní aplikací v jazyce F#.Začnete s několika rychlými analýzami dat pomocí interaktivního okna jazyka F#, pak budete psát a testovat kód k analýze dat a následně přidáte front-end jazyka C#, abyste přišli na to, jak je kód jazyka F# propojen s jinými jazyky technologie .NET.
Požadavky
Chcete-li dokončit tento návod, potřebujete následující komponenty:
- Visual Studio
[!POZNÁMKA]
Ve vašem počítači se pro některé z prvků uživatelského rozhraní sady Visual Studio mohou zobrazit jiné názvy a umístění, než jsou uvedeny v následujících pokynech. Tyto prvky jsou určeny verzí aplikace Visual Studio a použitým nastavením. Další informace naleznete v tématu Nastavení aplikace Visual Studio.
Pro vytvoření skriptu jazyka F#
Nejprve vytvořte skript jazyka F#.V nabídce Soubor přejděte na příkaz Nový a klikněte na Soubor.V dialogovém okně Nový soubor vyberte položku Skript v kategorii Obecné v seznamu šablon Nainstalované a potom vyberte Soubor skriptu jazyka F#.K vytvoření souboru klikněte na tlačítko Otevřít a soubor uložte jako RateAnalysis.fsx.
Pro přístup k datům z internetových stránek Federálního rezervního systému Spojených států použijte rozhraní API jazyka F# a technologii .NET.Zadejte následující kód.
open System.Net open System.IO let url = sprintf "http://www.federalreserve.gov/datadownload/Output.aspx?rel=H15&series=bcb44e57fb57efbe90002369321bfb3f&lastObs=&from=&to=&filetype=csv&label=include&layout=seriescolumn" let req = WebRequest.Create(url, Timeout = 10000000) let resp = req.GetResponse() let stream = resp.GetResponseStream() let reader = new StreamReader(stream) let csv = reader.ReadToEnd()
Všimněte si následujícího:
Klíčová slova a řetězce jsou obarvené.
Seznamy dokončení se zobrazí po zadání každé tečky (.).
Pomocí klávesové zkratky CTRL+MEZERNÍK nebo CTRL+J uprostřed identifikátoru lze získat názvy úplné metody systému Visual Studio a jiných identifikátorů.Při použití CTRL+J se zobrazí seznam dokončení.
Při umístění ukazatele myši na libovolný identifikátor v kódu se zobrazí popis obsahující informace o tomto identifikátoru.
Pokud stisknete klávesu F1, když je kurzor v WebRequest, zobrazí se očekávaná dokumentace.
Pokud stisknete klávesu F1, když je kurzor v let, zobrazí se očekávaná dokumentace.
Typy a obory názvů z mscorlib.dll, System.dll a System.Windows.Forms.dll jsou uvedeny ve výchozím nastavení.
Hodnota Timeout, která je zde nastavena, je vlastností, nikoli argumentem konstruktoru.Jazyk F# umožňuje nastavit hodnoty vlastnosti tímto způsobem.
Pokud je v příkladu zkopírována adresa URL do prohlížeče, zpět se vrátí seznam hodnot oddělených čárkami, který obsahuje data a úrokové sazby publikované Federálním rezervním systémem Spojených států.
Kód bude nyní spuštěn pomocí komponenty F# Interactive.Vyberte všechen kód (pomocí myši nebo stisknutím kláves CTRL+A), stiskněte pravé tlačítko a poté klikněte na Provést v Interactive.(Případně stiskněte klávesy ALT+ENTER.)
Pokud ještě nebylo viditelné, objeví se okno komponenty F# Interactive.
Kód je úspěšně spuštěn.
V okně komponenty F# Interactive se zobrazí následující.
val url : string = "http://www.federalreserve.gov/datadownload/Output.aspx?rel=H1"+[107 chars] val req : System.Net.WebRequest val resp : System.Net.WebResponse val stream : System.IO.Stream val reader : System.IO.StreamReader val csv : string = ""Series Description","Market yield on U.S. Treasury securities"+[224219 chars] >
Dále zkontrolujte data pomocí komponenty F# Interactive.V řádku komponenty F# Interactive zadejte csv; a stiskněte klávesu ENTER.Zadejte csv.Length;; a stiskněte klávesu ENTER.Všimněte si následujícího:
Data jsou aktuální.
Komponenta F# Interactive zobrazí hodnotu řetězce csv a jeho délku, jak je znázorněno zde.
07/10/2009, 3.32 07/13/2009, 3.38 07/14/2009, 3.50 07/15/2009, 3.63 " > csv.Length;; val it : int = 224513
Následující obrázek znázorňuje okno komponenty F# Interactive.
Okno komponenty F# Interactive
Nyní zapíšete kód jazyka F# k rozboru dat CSV (Hodnoty oddělené čárkou).Soubor CSV je takto nazván, protože obsahuje hodnoty oddělené čárkami.V Editoru kódu přidejte následující kód.Také přidejte open System.Globalization na začátku souboru.Při přidávání každého řádku vyberte kód přidaný v této části do tohoto řádku a stiskněte klávesy ALT+ENTER k zobrazení částečných výsledků.Všimněte si následujícího:
Technologie IntelliSense poskytuje po zadání období užitečné informace, dokonce i uprostřed složitých vnořených výrazů.
Pokud je kód neúplný (nebo nesprávný), červené podtržení vlnovkou označuje, že se v kódu objevují syntaktické a sémantické chyby.
Pomocí operátoru přesměrování (|>) jsou vytvořeny kanály.Operátor přesměrování vezme vrácenou hodnotu z jednoho výrazu a použije ji jako argument funkce na dalším řádku.Kanály a komponenta F# Interactive umožňují snadné částečné spuštění kódu zpracování dat.
let interest = csv.Split([|'\n'|]) |> Seq.skip 8 |> Seq.map (fun line -> line.Trim()) |> Seq.filter (fun line -> not (line.EndsWith("ND"))) |> Seq.filter (fun line -> not (line.Length = 0)) |> Seq.map (fun line -> line.Split([|','|])) |> Seq.map ( fun values -> System.DateTime.Parse(values.[0], CultureInfo.CreateSpecificCulture("en-US")), float values.[1])
Tuto funkci nyní pojmenujete.Odeberte řady ID bcb44e57fb57efbe90002369321bfb3f z definice url a nahraďte je %s k vytvoření řetězce formátu pro literál řetězce.Za řetězec formátu přidejte seriesID.Vyberte všechen kód kromě otevřených pokynů a stiskněte klávesu TAB.Nad odsazeným blokem kódu přidejte následující řádky kódu.
let loadRates maturity = // The following tuples associate various maturity durations, in years, // with codes defined for treasury bills by the Federal Reserve. let maturitiesMap = Map.ofList [(1, "e30653a4b627e9d1f2490a0277d9f1ac") (2, "c66ea77a2e8f0919c5133c7633065908") (5, "fbb02942bfdbff31a479e98bcbe26388") (10, "bcb44e57fb57efbe90002369321bfb3f") (20, "a1ebeb6e84ca6389772dd054dc980191")] let seriesID = Map.find maturity maturitiesMap
Na konci odsazeného bloku přidejte interest.Všimněte si následujícího:
Odsazení je významné v jazyce F#.Odsazení určuje úroveň vnoření.
Klávesa TAB je téměř stejná jako Extrahovat metoda optimalizace struktury programu (C#).
Kód nyní vypadá podobně jako následující.
open System.Net open System.IO let loadRates maturity = // The following tuples associate various maturity durations, in years, // with codes defined for treasury bills by the Federal Reserve. let maturitiesMap = Map.ofList [(1, "e30653a4b627e9d1f2490a0277d9f1ac") (2, "c66ea77a2e8f0919c5133c7633065908") (5, "fbb02942bfdbff31a479e98bcbe26388") (10, "bcb44e57fb57efbe90002369321bfb3f") (20, "a1ebeb6e84ca6389772dd054dc980191")] let seriesID = Map.find maturity maturitiesMap let url = sprintf "http://www.federalreserve.gov/datadownload/Output.aspx?rel=H15&series=%s&lastObs=&from=&to=&filetype=csv&label=include&layout=seriescolumn" seriesID let req = WebRequest.Create(url, Timeout = 10000000) let resp = req.GetResponse() let stream = resp.GetResponseStream() let reader = new StreamReader(stream) let csv = reader.ReadToEnd() let interest = csv.Split([|'\n'|]) |> Seq.skip 8 |> Seq.map (fun line -> line.Trim()) |> Seq.filter (fun line -> not (line.EndsWith("ND"))) |> Seq.filter (fun line -> not (line.Length = 0)) |> Seq.map (fun line -> line.Split([|','|])) |> Seq.map ( fun values -> System.DateTime.Parse(values.[0], CultureInfo.CreateSpecificCulture("en-US")), float values.[1]) interest
Tuto funkci nyní použijete na nových vstupech.Vyberte celý kód a stiskněte klávesy ALT+ENTER ke spuštění pomocí komponenty F# Interactive.V příkazovém řádku komponenty F# Interactive zavolejte novou funkci loadRates na jiné sazby splatnosti: 1, 2 a 5 v letech.Všimněte si následujícího:
Předchozí definice nejsou ztraceny v komponentě F# Interactive, ale k dispozici jsou nové definice.
Speciální funkce tisk zpracuje složitá strukturovaná data.
Pro vývoj komponenty pomocí jazyka F#
Vytvořte projekt knihovny k vystavení funkce, kterou jste vytvořili.V nabídce Soubor přejděte na příkaz Nový a klikněte na Projekt.V dialogovém okně Nový projekt vyberte položku Visual F# v seznamu Nainstalované a potom Knihovny jazyka F# k vytvoření nového projektu knihovny.Uveďte název projektu RateAnalysis.Zkopírujte kód, který jste dříve vytvořili z RateAnalysis.fsx a vložte jej do Library1.fs.Na začátek souboru přidejte deklaraci modulu: module RateLoader.V Aplikaci Solution Explorer přejmenujte Library1.fs na RateLoader.fsa soubor uložte.Všimněte si následujícího:
- Výchozí šablona knihovny jazyka F# poskytuje soubor kódu s příponou .fs a skript, který má příponu .fsx.Kód knihovny lze interaktivně testovat pomocí souboru skriptu.
Nyní bude vytvořena třída jazyka F#, která poskytuje požadovanou funkci.V Průzkumníku řešení klikněte pravým tlačítkem myši na název projektu, přejděte na Přidat, a pak klikněte na Nová položka.V dialogovém okně Přidat novou položku vyberte položku Zdrojový soubor jazyka F#.Pojmenujte soubor Analyzer.fs.Pravým tlačítkem myši klikněte na Script.fsx v Aplikaci Solution Explorer a klikněte na tlačítko Dolů.(Případně stiskněte klávesy ALT+ŠIPKA DOLŮ.) Do Analyzer.fs vložte následující kód:
module RateAnalysis.Analyzer open RateLoader /// Provides analysis of historical interest rate data. type Analyzer(ratesAndDates) = let rates = ratesAndDates |> Seq.map snd /// Construct Analyzer objects for each maturity category. static member GetAnalyzers(maturities) = maturities |> Seq.map loadRates |> Seq.map (fun ratesAndDates -> new Analyzer(ratesAndDates)) member sa.Min = let date, minRate = (Seq.minBy (fun (_, rate) -> rate) ratesAndDates) (minRate, date.ToString("d")) member sa.Max = let date, maxRate = (Seq.maxBy (fun (_, rate) -> rate) ratesAndDates) (maxRate, date.ToString("d")) member sa.Current = rates |> List.ofSeq |> List.rev |> List.head
Všimněte si následujícího:
- Jazyk F# podporuje koncepci objektově orientovaného programování.Další informace naleznete v Třídy (F#), Dědičnost (F#)a dalších příslušných témat v Referenční příručce jazyka F#.
K vytvoření projektu stiskněte kombinaci kláves CTRL+SHIFT+B nebo F6.Všimněte si následujícího:
Projekt se úspěšně vytvoří.
Okno seznamu chyb nezobrazí žádné chyby.
Výstupní adresář obsahuje soubory .dll, .pdb a .xml.
Výstupní okno zobrazí následující:
------ Build started: Project: RateAnalysis, Configuration: Debug Any CPU ------ C:\Program Files (x86)\Microsoft F#\v4.0\fsc.exe -o:obj\Debug\RateAnalysis.exe -g --debug:full --noframework --define:DEBUG --define:TRACE --optimize- --tailcalls- -r:"C:\Program Files (x86)\Microsoft F#\v4.0\FSharp.Core.dll" -r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll" -r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll" -r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll" --target:exe --warn:3 --warnaserror:76 --vserrors --utf8output --fullpaths --flaterrors Program.fs RateLoader.fs ValueAnalyzer.fs RateAnalysis -> C:\Users\ghogen\Documents\Visual Studio 10\Projects\RateAnalysis\RateAnalysis\bin\Debug\RateAnalysis.exe ========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
Pro přidání klientské aplikace jazyka C# otevřete rychlou nabídku pro uzel řešení, zvolte Přidat a pak zvolte Nový projekt.V dialogovém okně Přidat nový projekt zvolte Visual C# v seznamu Nainstalované šablony a pak zvolte Konzolová aplikace.Bude pravděpodobně nutné rozbalit uzel Jiné jazyky.Pojmenujte projekt CSharpDriver a pak zvolte tlačítko OK.Otevřete místní nabídku na uzlu Odkazy tohoto projektu a pak zvolte Přidat odkaz na.Zvolte uzel Řešení a pak zvolte uzel Projekty.Zaškrtněte políčko vedle projektu RateAnalysis a pak zvolte tlačítko OK.Otevřete místní nabídku pro uzel projektu CSharpDriver a klikněte na tlačítko Nastavit jako projekt při spuštění.Zadejte následující kód v textu metody Main aplikace jazyka C#.
var maturities = new[] { 1, 2, 5, 10 }; var analyzers = RateAnalysis.Analyzer.Analyzer.GetAnalyzers(maturities); foreach (var item in analyzers) { Console.WriteLine("Min = {0}, \t Max = {1}, \t Current = {2}", item.Min, item.Max, item.Current); } Console.WriteLine("Press Enter to exit."); Console.ReadLine();
Všimněte si následujícího:
Lze přidat křížové odkazy mezi projekty do jazyků C# a F# a z nich.
Lze použít obory názvů a typy z jazyka C# definované v jazyce F# jako libovolný jiný typ.
Komentáře dokumentace jazyka F# jsou k dispozici v technologii IntelliSense jazyka C#.
Jazyk C# může přistupovat k vráceným hodnotám n-tice z rozhraní API jazyka F#.N-tice jsou hodnoty Tuple v rozhraní .NET Framework 4.5.
Pro ladění aplikace stiskněte klávesu F11 pro vytvoření aplikace, spusťte aplikaci v ladicím programu a vstupte do prvního řádku spuštěného kódu.Stiskněte klávesu F11 několikrát, dokud nevstoupíte do kódu jazyka F# v textu člena GetAnalyzers.Všimněte si následujícího:
Z kódu jazyka C# lze snadno vstoupit do kódu jazyka F#.
Každý výraz v jazyce F# je krokem v ladicím programu.
Okno místních hodnot zobrazuje hodnoty maturities.
Pokračování stisknutím klávesy F11 vede prostřednictvím hodnocení zbylé části aplikace.
Všechny příkazy ladicího programu jako Přejít ke kurzoru, Zadat další příkaz, Vložit zarážku, Přidat sledování a Přejít na zpětný překlad fungují podle očekávání.
Pro nasazení aplikace
Pokud stále ladíte, ladění zastavte pomocí klíčů SHIFT + F5 nebo otevřením nabídky Ladění a následným zvolením Zastavit ladění.
Otevřete místní nabídku pro projekt CSharpDriver a pak zvolte Vlastnosti.
V návrháři projektu zvolte kartu Publikovat, která zobrazuje možnosti nasazení aplikace.
Zvolte tlačítko Průvodce publikováním.
Spustí se Průvodce publikováním a na první obrazovce budete dotázáni, kam chcete umístit publikované soubory.
Do textového pole zadejte umístění souboru na místním disku, kam chcete při publikování umístit instalační soubory pro aplikace, nebo zvolte tlačítko Procházet pro navigaci k umístění.
Zvolte tlačítko Dokončit pro potvrzení celého výchozího nastavení k vytvoření standardní instalace, která může být distribuována do klientských přístrojů, nebo zvolte tlačítko Další pro zobrazení další možností publikování.
Instalační soubor a podpůrné soubory jsou publikovány do určeného umístění.
Další kroky
Psaní kódu v jazyce F# začněte přečtením Názorný postup: První F# programu a přečtením Funkce jako prvotřídní hodnoty (F#) se naučte funkce jazyka F# .Jazyk F# můžete prozkoumat čtením F# Language Reference.