Aracılığıyla paylaş


İzlenecek yol: Visual F# kullanarak oluşturmak, hata ayıklamak ve bir uygulamayı dağıtmak için

Bu izlenecek yol size F#'ı Visual Studio içinde .NET Framework 4.5 ile kullanma deneyimini tanıtır.

Bu izlenecek yolda Visual Studio kullanarak F# uygulamaları yazmaya nasıl başlayacağınızı ABD'nin hazine faiz oranı verisinin tarihi bir analizi örneği ile öğreneceksiniz. F# etkileşimli pencereyi kullanarak bazı hızlı veri çözümlemesine başlayacaksınız sonra verileri çözümlemek için kod yazın ve test edin ve daha sonra diğer .NET dilleriyle F# kod tümleştirmeyi keşfetmek için C# ön uç ekleyin.

Önkoşullar

Bu örneği tamamlamak için aşağıdaki bileşenler gerekmektedir:

  • Visual Studio

Not

Bilgisayarınızda, aşağıdaki yönergelerde yer alan Visual Studio kullanıcı arabirimi öğelerinden bazılarının adı veya konumu farklı gösterilebilir. Bu öğeleri bilgisayarınızdaki Visual Studio sürümü ve kullandığınız ayarlar belirler. Daha fazla bilgi için bkz: Visual Studio ayarları.

F# betiği oluşturmak için

  1. Önce bir F# betiği oluşturun. Dosya menüsünde Yeni'nin üzerine gelin, ardından Dosya seçeneğini tıklatın. New File iletişim kutusu içinde, Installed şablonlar listesi altında General kategorisi içinde Script seçin, ve ardından F# Script File seçin. Dosyayı oluşturmak için 'ı tıklayın ve dosyayı RateAnalysis.fsx olarak kaydedin.

  2. .NET ve F# API'lerini ABD Federal Merkez internet sitesinden verilere erişmek için kullanın. Aşağıdaki kodu yazın.

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

    Aşağıdakilere dikkat edin:

    • Dizeler ve anahtar sözcükler renklendirilmiştir.

    • Tamamlama listeleri her noktayı (.) yazdıktan sonra ortaya çıkar.

    • Klavye kısayolu CTRL+SPACE veya tanımlayıcı ortasında CTRL+J kullanarak Visual Studio'ya yöntem adları ve diğer tanımlayıcıları tamamlatabilirsiniz. CTRL+J kullandığınızda tamamlanma listesi görüntülenir.

    • Fare işaretçisini herhangi bir tanımlayıcı kodu üzerinde tuttuğunuzda, o tanımlayıcı hakkında bilgi içeren araç ipucu görürsünüz.

    • İmleç WebRequest içindeyken F1 tuşuna basarsanız beklenen belgeler gözükür.

    • İmleç let içindeyken F1 tuşuna basarsanız beklenen belgeler gözükür.

    • Varsayılan olarak, mscorlib.dll, System.dll ve System.Windows.Forms.dll tür ve isim uzaylarına başvurulur.

    • Burada ayarlanan Timeout değeri oluşturucu bağımsız değişkeni değil bir özelliktir. F# bu anlamda özellik değerlerini ayarlamanıza olanak sağlar.

    • Örnekte URL'i bir tarayıcıya kopyalarsanız, virgülle ayrılmış tarih ve ABD Federal Merkez tarafından yayımlanan faiz oranlarını içeren değerler listesini görürsünüz.

  3. Şimdi F# Etkileşimi kullanarak kodu çalıştırın. Tüm kodu seçin (bir fare kullanarak ya da CTRL+A'ya basarak) ve sağ tıklatın, ve ardından Execute In Interactive tıklatın. (Alternatif olarak, ALT+ENTER tuşlarına basın.)

    • Hala görünür olmadıysa, F# Etkileşim penceresi ortaya çıkar.

    • Kod başarıyla çalıştırılır.

    • Aşağıdakiler F# Etkileşim penceresinde görünür.

      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]
      
      >
      
  4. Ardından, F# Etkileşimi kullanarak verileri inceleyin. F# Etkileşim istemine cvs;; yazın ve sonra ENTER tuşuna basın. csv.Length;; yazın ve ENTER tuşuna basın. Aşağıdakilere dikkat edin:

    • Mevcut veri.

    • F# Etkileşim burda gösterildiği gibi csv dizesinin değerini ve uzunluğunu görüntüler.

      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
      
    • Aşağıdaki internet erişimi F# Etkileşim penceresini gösterir.

      F# Etkileşim Penceresi

      F# Etkileşim penceresi

  5. Şimdi, CSV (Virgül ile ayrılmış değerler) verilerini ayrıştırmak için F# kodu yazacaksınız. Bir CSV dosyası virgülle ayrılmış değerler içerdiği için bu şekilde adlandırılır. Kod Düzenleyicisi'ne aşağıdaki kodu ekleyin. Ayrıca, dosyanın başına open System.Globalization ekleyin. Her satırı ekledikçe, kısmi sonuçları görmek için bu bölüme eklenen kodu seçin ve ALT+ENTER tuşlarına basın. Aşağıdakilere dikkat edin:

    • IntelliSense iç içe karmaşık ifadelerin ortasında bile nokta yazdıktan sonra yararlı bilgiler sağlar.

    • Kod tamamlanmamış (veya yanlış) olduğunda, kırmızı dalgalı alt çizgiler kod içinde sözdizimsel ve anlamsal hataların olduğunu belirtir.

    • Dikey çizgi işleci (|>) kullanarak ardışık düzen oluşturun. Dikey çizgi işleci bir ifadeden dönen değeri alır ve sonraki satırdaki işlev için bağımsız değişken olarak kullanır. Ardışık düzen ve F# Etkileşim bilgi işlem kodunun kolayca kısmi olarak çalıştırılmasına izin verir.

    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])
    
  6. Şimdi bu işlevselliğe bir ad verin. Değişmez değer dizesini bir biçim dizesi yapmak için url tanımından seri kimliği bcb44e57fb57efbe90002369321bfb3f kaldırın ve yerine %s koyun. Biçim dizesinden sonra seriesID ekleyin. Açık emirler dışındaki tüm kodu seçin, ve TAB tuşuna basın. Girintili kod bloğu üstünde, aşağıdaki kod satırlarını ekleyin.

    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
    

    Girintili bloğunun sonuna interest ekleyin. Aşağıdakilere dikkat edin:

    Kod şimdi aşağıdakine benzer.

    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
    
  7. Şimdi yeni girişler üzerinde bu işlevselliği kullanın. Tüm kodu seçin ve F# Etkileşimi kullanarak çalıştırmak için ALT+ENTER tuşlarına basın. F# Interactive isteminde, yeni loadRates methodunu ya da diğer vade oranlarını çağırın: 1, 2 ve 5, yıl olarak. Aşağıdakilere dikkat edin:

    • Önceki tanımlar F# Etkileşim içinde kaybolmaz ancak yeni tanımlar kullanılabilir.

    • Karmaşık yapılandırılmış veriler özel yazdırma işlevselliği tarafından işlenir.

F# kullanarak bileşen geliştirmek için

  • Oluşturduğunuz işlevselliği göstermek için bir kitaplık projesi oluşturun. Dosya menüsünde, Yeni'nin üzerine gelin ve Proje'yi tıklayın. New Project iletişim kutusu içinde, Installed listesi içinde Visual F#, ve ardından F# Library seçerek yeni bir kitaplık projesi oluşturun. Projeye RateAnalysis adını verin. RateAnalysis.fsx'te daha önce oluşturduğunuz kodu kopyalayın ve Library1.fs'e yapıştırın. Dosyanın en üstüne bir modül bildirimi ekleyin: module RateLoader. Solution Explorer içinde, Library1.fs yeniden adlandırarak RateLoader.fs yapın, ve dosyayı kaydedin. Aşağıdakilere dikkat edin:

    • Varsayılan F# Kitaplık şablonu uzantısı .fs olan bir kod dosyası ile uzantısı .fsx olan bir betik sağlar. Kitaplık kodunuzu etkileşimli olarak test etmek için betiğinizi kullanabilirsiniz.
  1. Şimdi istenen işlevselliği sunan bir F# sınıfı oluşturun. Çözüm Gezgini'nde projeye sağ tıklayın, Ekle üzerine gelin ve Yeni Öğe'yi tıklayın. Yeni Öğe Ekle iletişim kutusunda F# Kaynak Dosya'sını seçin. Dosyayı Analyzer.fs olarak adlandırın. Çözüm Gezgini'nde Script.fsx'e sağ tıklayın ve sonra Move Down'u tıklayın. (Alternatif olarak, ALT+AŞAĞI OK tuşuna basın.) Aşağıdaki kodu Analyzer.fs'e yapıştırın.

    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 
    

    Aşağıdakilere dikkat edin:

    • F# nesne yönelimli programlama kavramlarını destekler. F# Dili Başvuru Kaynaklarında diğer ilgili konular hakkında daha fazla bilgi için bkz. Sınıflar (F#), Kalıtım (F#).
  2. Projeyi oluşturmak için CTRL+SHIFT+B veya F6 tuşuna basın. Aşağıdakilere dikkat edin:

    • Proje başarıyla oluşturulur.

    • Hata listesi penceresinde hiçbir hata gözükmez.

    • Çıktı dizini .dll, .pdb ve .xml dosyalarını içerir.

    • Çıkış penceresi aşağıdakileri görüntüler:

      ------ 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 ==========
      
  3. Bir C# istemci uygulaması eklemek için, çözüm düğümü için kısayol menüsünü açın, Add seçin, ve ardından New Project seçin. Add New Project iletişim kutusu içinde, Installed Templates listesi içinde Visual C# seçin, ve ardından Console Application seçin. Other Languages düğümünü genişletmeniz gerekebilir. Projeyi CSharpDriver olarak adlandırın, ve ardından OK düğmesini seçin. Bu projenin References düğümünün kısayol menüsünü açın, ve ardından Add Reference seçin. Solution düğümünü seçin, ve ardından Projects düğümünü seçin. RateAnalysis projesi yanındaki onay kutusunu seçin, ve ardından OK düğmesini seçin. CSharpDriver proje düğümü için kısayol menüsünü açın, ve Set as Startup Project tıklatın. C# uygulamasının Main yöntem gövdesine aşağıdaki kodu yazın.

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

    Aşağıdakilere dikkat edin:

    • C# ve F#'a gelen veya C# ve F#'tan giden proje için proje başvurularını ekleyebilirsiniz.

    • C#'tan gelen F# tanımlı ad alanlarını ve türleri diğer türler gibi kullanabilirsiniz.

    • F# belge açıklamaları C# IntelliSense'de mevcuttur.

    • C#, F# API'sinden dönen değerler dizisine erişebilir. Kayıt düzenleri .NET Framework 4.5 içinde Tuple değerleridir.

  4. Uygulamada hata ayıklamak için, uygulama başlatmak için F11 tuşuna basın, uygulamayı hata ayıklayıcıda başlatın ve çalıştırılan kodda ilk satıra gidin. GetAnalyzers üyesinin gövdesindeki F# koduna gelinceye kadar birkaç kez daha F11 tuşuna basın. Aşağıdakilere dikkat edin:

    • C# kodundan kolayca F# koduna geçebilirsiniz.

    • Her F# ifadesi hata ayıklayıcıda bir adımdır.

    • Yerel penceresi maturities değerlerini gösterir.

    • Uygulamanın geri kalan değerlendirilmesinde F11 tuşuna basmaya devam edin.

    • Imleç Çalıştır, Sonraki Deyimi Ayarla, Kesme Noktası Ekle, Gözcü Ekle ve Çözüme Git gibi komutlar beklenen şekilde çalışır.

Uygulamayı Dağıtmak İçin

  1. Eğer hala hata ayıklıyorsanız, SHIFT + F5 tuşlarını seçerek ya da Debug menüsünü açıp ardından Stop Debugging seçerek hata ayıklamayı durdurun.

  2. CSharpDriver projesi için kısayol menüsünü açın, ve ardından Properties seçin.

  3. Proje tasarımcısı içinde, uygulamanızı dağıtma için seçenekleri gösteren Publish sekmesini seçin.

  4. Publish Wizard düğmesini seçin.

    Yayımlama Sihirbazı başlar, ve ilk ekran dağıtılan dosyaların nereye yerleştirilmesini istediğinizi sorar.

  5. Metin kutusu içinde, dağıttığınızda uygulamanızın yükleme dosyalarının disk üzerinde yerleştirileceği bir dosya konumu belirtin, ya da bir konuma gitmek için Browse düğmesini seçin.

  6. İstemci makinelere dağıtılabilecek bir standart kurulum oluşturmak için tüm varsayılanları kabul etmek için Finish düğmesini seçin, ya da diğer yayımlama seçeneklerini görüntülemek için Next düğmesini seçin.

    Belirttiğiniz konuma bir kurulum yürütülebiliri ve destek dosyaları yayımlanır.

Sonraki Adımlar

F# kodu yazmaya İzlenecek yol: İlk F# programınızı'ı veya F# işlevleri hakkında öğrenmek için İlk Sınıf Değerleri (F#) olarak İşlevler'u okuyarak başlayın. F# dilini F# dil başvurusu okuyarak keşfedebilirsiniz.

Ayrıca bkz.

Diğer Kaynaklar

Görsel F# örnekleri ve izlenecek yollar

Görsel F# örnekleri ve izlenecek yollar