2016-04-25 08:57:21 +03:00
---
language: F#
contributors:
- ["Scott Wlaschin", "http://fsharpforfunandprofit.com/"]
translators:
- ["Mustafa Zengin", "http://zengin.github.com/"]
filename: learnfsharp.fs
---
2016-04-26 02:02:07 +03:00
F# fonksiyonel ve nesne yönelimli, genel amaçlı bir programlama dilidir. Bedava ve açı k kaynaklı dı r ve Linux, Mac, Windows ve dahası nda çalı şı r.
2016-04-25 08:57:21 +03:00
Hataları derleme zamanı nda yakalayan çok güçlü bir tip sistemine sahiptir, ancak tip çı karı mı yaptı ğı ndan dinamik bir dil gibi görünür.
F#'ı n söz dizimi C-stili dillerden farklı dı r:
* Küme parantezi kod blokları nı ayı rmak için kullanı lmaz. Bunun yerine Python'da olduğu gibi girinti kullanı lı r.
* Parametreleri birbirinden ayı rmak için virgül yerine boşluk karakteri kullanı lı r.
Aşağı daki kodu denemek istiyorsanı z, [tryfsharp.org ](http://www.tryfsharp.org/Create )'a gidin be interaktif REPL'e kodu yapı ştı rı n.
```csharp
// tek satı r yorumlar ikili bölme işareti kullanı lı r
(* çok satı rlı yorumlar (* . . . *) ikilisini kullanı r
-çok satı rlı yorumun sonu- *)
// ================================================
// Temel Söz Dizimi
// ================================================
// ------ "Değişkenler" (tam da değil) ------
// "let" anahtar kelimesi (değişmez) değer tanı mlar
let myInt = 5
let myFloat = 3.14
let myString = "hello" // tip bilgisi olmaması na dikkat
// ------ Listeler ------
let twoToFive = [2; 3; 4; 5] // Köşeli parantezler listeleri oluşturur,
// değerler ise noktalı virgülle ayrı lı r.
let oneToFive = 1 :: twoToFive // :: yeni birinci elemanı olan bir liste oluşturur.
// Sonuç: [1; 2; 3; 4; 5]
let zeroToFive = [0; 1] @ twoToFive // @ iki listeyi birbirine ekler.
// ÖNEMLİ: virgüller hiçbir zaman ayraç olarak kullanı lmaz, sadece noktalı virgüller!
// ------ Fonksiyonlar ------
// "let" anahtar kelimesi isimlendirilmiş fonksiyonları da tanı mlar.
let square x = x * x // Parantez kullanı lmadı ğı na dikkat.
square 3 // Şimdi fonksiyonu uygula. Yine parantez yok.
let add x y = x + y // add (x,y) kullanmayı n! Bu tamamen başka bir anlama geliyor.
add 2 3 // Şimdi fonksiyonu uygula.
// çok satı rlı bir fonksiyon tanı mlamak için sadece girinti kullan. Noktalı ı virgül gerekmez.
let evens list =
let isEven x = x % 2 = 0 // "isEven"ı alt fonksiyon olarak tanı mla
List.filter isEven list // List.filter boolean bir fonksiyon ve
// üzerinde çalı şı lacak bir liste parametrelerinden oluşan
// bir kütüphane fonksiyonu
evens oneToFive // Şimdi fonksiyonu uygula.
// Parantezleri önceliği netleştirmek için kullanabilirsin. Bu örnekte
// "map"i önce iki argümanla uygula, sonra sonuç üzerinde "sum" uygula.
// Parantezler olmasaydı , "List.map" List.sum'ı n ilk argümanı olurdu.
let sumOfSquaresTo100 =
List.sum ( List.map square [1..100] )
// Bir operasyonun sonucunu bir sonrakine "|>" kullanarak besleyebilirsin.
// Veri beslemek F#'ta UNIX'te olduğu gibi yaygı ndı r..
// Burada sumOfSquares fonksiyonunun veri beslemeyle yazı lmı ş hali var:
let sumOfSquaresTo100piped =
[1..100] |> List.map square |> List.sum // "square" önceden tanı mlanmı ştı
// Lambda'ları (anonim fonksiyonları ) "fun" anahtar kelimesiyle tanı mlayabilirsin
let sumOfSquaresTo100withFun =
[1..100] |> List.map (fun x -> x * x) |> List.sum
// F#'ta "return" anahtar kelimesi yoktur. Bir fonksiyon
// her zaman son kullanı lan ifadeyi döndürür.
// ------ Kalı p eşleştirme ------
// Match..with.. çok güçlü bir case/switch türevidir.
let simplePatternMatch =
let x = "a"
match x with
| "a" -> printfn "x is a"
| "b" -> printfn "x is b"
| _ -> printfn "x is something else" // alt çizgi bütün kalı plarla eşleşir
// F# varsayı lan olarak null'lara izin vermez -- Option tipini kullanı p
// kalı p eşleştirme yapmalı sı n.
// Some(..) ve None, Nullable tipler gibidir.
let validValue = Some(99)
let invalidValue = None
// Bu örnekte, match..with "Some" ve "None"la eşleştirme yapı yor,
// ve ayrı ca "Some" içerisindeki değeri de çı karı yor.
let optionPatternMatch input =
match input with
| Some i -> printfn "input is an int=%d" i
| None -> printfn "input is missing"
optionPatternMatch validValue
optionPatternMatch invalidValue
2016-04-26 02:02:07 +03:00
// ------ Yazdı rma ------
// printf/printfn fonksiyonları C#'taki
// Console.Write/WriteLine fonksiyonları na benzer.
2016-04-25 08:57:21 +03:00
printfn "Printing an int %i, a float %f, a bool %b" 1 2.0 true
printfn "A string %s, and something generic %A" "hello" [1; 2; 3; 4]
2016-04-26 02:02:07 +03:00
// sprintf/sprintfn fonksiyonları ise veriyi string'e
// çevirmek içindir, C#'taki String.Format gibi.
2016-04-25 08:57:21 +03:00
// ================================================
2016-04-26 02:02:07 +03:00
// Fonksiyonlar hakkı nda dahası
2016-04-25 08:57:21 +03:00
// ================================================
2016-04-26 02:02:07 +03:00
// F# gerçek bir fonksiyonel dildir. Fonksiyonlar birinci
// sı nı f varlı klardı r ve güçlü yapı lar oluşturmak için
// birleştirilebilirler.
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// Modüller fonksiyonları gruplamak için kullanı lı r.
// Her bir modül için girinti gerekir.
2016-04-25 08:57:21 +03:00
module FunctionExamples =
2016-04-26 02:02:07 +03:00
// Temel bir ekleme fonksiyonu tanı mla
2016-04-25 08:57:21 +03:00
let add x y = x + y
2016-04-26 02:02:07 +03:00
// Bir fonksiyonun temel kullanı mı
2016-04-25 08:57:21 +03:00
let a = add 1 2
printfn "1 + 2 = %i" a
2016-04-26 02:02:07 +03:00
// Parametreleri kaynaklamak için parçalı uygulama
2016-04-25 08:57:21 +03:00
let add42 = add 42
let b = add42 1
printfn "42 + 1 = %i" b
2016-04-26 02:02:07 +03:00
// Fonksiyonları birleştirmek için kompozisyon
2016-04-25 08:57:21 +03:00
let add1 = add 1
let add2 = add 2
let add3 = add1 >> add2
let c = add3 7
printfn "3 + 7 = %i" c
2016-04-26 02:02:07 +03:00
// Yüksek dereceli fonksiyonlar
2016-04-25 08:57:21 +03:00
[1..10] |> List.map add3 |> printfn "new list is %A"
2016-04-26 02:02:07 +03:00
// Fonksiyonlar listesi ve dahası
2016-04-25 08:57:21 +03:00
let add6 = [add1; add2; add3] |> List.reduce (>>)
let d = add6 7
printfn "1 + 2 + 3 + 7 = %i" d
// ================================================
2016-04-26 02:02:07 +03:00
// Listeler ve kolleksiyonlar
2016-04-25 08:57:21 +03:00
// ================================================
2016-04-26 02:02:07 +03:00
// Üç çesit sı ralı fonksiyon vardı r:
// * Listeler en temel değiştirilemez kolleksiyonlardı r.
// * Diziler değiştirilebilir ve gerektiğinde daha verimlidirler.
// * Seriler tembel (lazy evaluation) ve sonsuzdurlar (Enumeratörler gibi).
//
// Değiştirilmez map'ler ve kümeler ve bütün .NET kolleksiyonları
// diğer kolleksiyon türleridir.
2016-04-25 08:57:21 +03:00
module ListExamples =
2016-04-26 02:02:07 +03:00
// listeler köşeli parantez kullanı r
2016-04-25 08:57:21 +03:00
let list1 = ["a"; "b"]
2016-04-26 02:02:07 +03:00
let list2 = "c" :: list1 // :: başa eleman ekler
let list3 = list1 @ list2 // @ listeleri birbirine ekler
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// Liste comprehension'ları (jeneratörler olarak da bilinir)
2016-04-25 08:57:21 +03:00
let squares = [for i in 1..10 do yield i * i]
2016-04-26 02:02:07 +03:00
// asal sayı jeneratörü
2016-04-25 08:57:21 +03:00
let rec sieve = function
| (p::xs) -> p :: sieve [ for x in xs do if x % p > 0 then yield x ]
| [] -> []
let primes = sieve [2..50]
printfn "%A" primes
2016-04-26 02:02:07 +03:00
// Listelerle kalı p eşleştirme
2016-04-25 08:57:21 +03:00
let listMatcher aList =
match aList with
| [] -> printfn "the list is empty"
| [first] -> printfn "the list has one element %A " first
| [first; second] -> printfn "list is %A and %A" first second
| _ -> printfn "the list has more than two elements"
listMatcher [1; 2; 3; 4]
listMatcher [1; 2]
listMatcher [1]
listMatcher []
2016-04-26 02:02:07 +03:00
// Listeleri kullanarak recursion
2016-04-25 08:57:21 +03:00
let rec sum aList =
match aList with
| [] -> 0
| x::xs -> x + sum xs
sum [1..10]
// -----------------------------------------
2016-04-26 02:02:07 +03:00
// Standart kütüphane fonksiyonları
2016-04-25 08:57:21 +03:00
// -----------------------------------------
// map
let add3 x = x + 3
[1..10] |> List.map add3
// filter
let even x = x % 2 = 0
[1..10] |> List.filter even
2016-04-26 02:02:07 +03:00
// ve dahası -- dökümantasyonu bakı nı z
2016-04-25 08:57:21 +03:00
module ArrayExamples =
2016-04-26 02:02:07 +03:00
// Diziler köşeli parantezle birlikte çubuk karakterini kullanı r
2016-04-25 08:57:21 +03:00
let array1 = [| "a"; "b" |]
2016-04-26 02:02:07 +03:00
let first = array1.[0] // nokta kullanarak indeks erişimi
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// Diziler için kalı p eşleştirme listlerle aynı dı r
2016-04-25 08:57:21 +03:00
let arrayMatcher aList =
match aList with
| [| |] -> printfn "the array is empty"
| [| first |] -> printfn "the array has one element %A " first
| [| first; second |] -> printfn "array is %A and %A" first second
| _ -> printfn "the array has more than two elements"
arrayMatcher [| 1; 2; 3; 4 |]
2016-04-26 02:02:07 +03:00
// Listede olduğu gibi kütüphane fonksiyonları
2016-04-25 08:57:21 +03:00
[| 1..10 |]
|> Array.map (fun i -> i + 3)
|> Array.filter (fun i -> i % 2 = 0)
|> Array.iter (printfn "value is %i. ")
module SequenceExamples =
2016-04-26 02:02:07 +03:00
// seriler kı vrı k parantez kullanı r
2016-04-25 08:57:21 +03:00
let seq1 = seq { yield "a"; yield "b" }
2016-04-26 02:02:07 +03:00
// seriler yield'ı kullanabilir
// ve alt seriler barı ndı rabilir
2016-04-25 08:57:21 +03:00
let strange = seq {
2016-04-26 02:02:07 +03:00
// "yield" bir eleman ekliyor
2016-04-25 08:57:21 +03:00
yield 1; yield 2;
2016-04-26 02:02:07 +03:00
// "yield!" bütün bir alt seriyi ekliyor
2016-04-25 08:57:21 +03:00
yield! [5..10]
yield! seq {
for i in 1..10 do
if i % 2 = 0 then yield i }}
// test
strange |> Seq.toList
2016-04-26 02:02:07 +03:00
// Seriler "unfold" kullanı larak oluşturulabilir
// Fibonacci serisi örneği
2016-04-25 08:57:21 +03:00
let fib = Seq.unfold (fun (fst,snd) ->
Some(fst + snd, (snd, fst + snd))) (0,1)
// test
let fib10 = fib |> Seq.take 10 |> Seq.toList
printf "first 10 fibs are %A" fib10
// ================================================
2016-04-26 02:02:07 +03:00
// Veri Tipleri
2016-04-25 08:57:21 +03:00
// ================================================
module DataTypeExamples =
2016-04-26 02:02:07 +03:00
// Bütün veriler varsayı lan olarak değiştirilemezdir.
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// Tuple'lar çabuk ve kolay anonim tiplerdir.
// -- Tuple oluşturmak için virgül kullan
2016-04-25 08:57:21 +03:00
let twoTuple = 1, 2
let threeTuple = "a", 2, true
2016-04-26 02:02:07 +03:00
// paketi açmak için kalı p eşleştirme kullan
let x, y = twoTuple // x = 1, y = 2
2016-04-25 08:57:21 +03:00
// ------------------------------------
2016-04-26 02:02:07 +03:00
// Record tipi isimlendirilmiş alanlara sahiptir
2016-04-25 08:57:21 +03:00
// ------------------------------------
2016-04-26 02:02:07 +03:00
// "type" ile kı vrı k parantezleri record tipi oluşturmak için kullan
2016-04-25 08:57:21 +03:00
type Person = {First:string; Last:string}
2016-04-26 02:02:07 +03:00
// "let" ile kı vrı k parantezi record tipi oluşturmak için kullan
2016-04-25 08:57:21 +03:00
let person1 = {First="John"; Last="Doe"}
2016-04-26 02:02:07 +03:00
// paketi açmak için kalı p eşleştirme kullan
let {First = first} = person1 // first="John"
2016-04-25 08:57:21 +03:00
// ------------------------------------
2016-04-26 02:02:07 +03:00
// Union tipleri (değişkenler olarak da bilinir) birden fazla
// seçeneğe sahiptir. Belli bir zamanda sadece bir tanesi geçerlidir.
2016-04-25 08:57:21 +03:00
// ------------------------------------
2016-04-26 02:02:07 +03:00
// "type" ile çubuk karakterini union tipi tanı mlamak için kullan
2016-04-25 08:57:21 +03:00
type Temp =
| DegreesC of float
| DegreesF of float
2016-04-26 02:02:07 +03:00
// Seçeneklerden birini kullan
2016-04-25 08:57:21 +03:00
let temp1 = DegreesF 98.6
let temp2 = DegreesC 37.0
2016-04-26 02:02:07 +03:00
// Paketi açmak için bütün seçenekler üzerinde kalı p eşleştirme kullan
2016-04-25 08:57:21 +03:00
let printTemp = function
| DegreesC t -> printfn "%f degC" t
| DegreesF t -> printfn "%f degF" t
printTemp temp1
printTemp temp2
// ------------------------------------
2016-04-26 02:02:07 +03:00
// Yinelgen (Recursive) tipler
2016-04-25 08:57:21 +03:00
// ------------------------------------
2016-04-26 02:02:07 +03:00
// Tipler alt sı nı flar oluşturmadan karmaşı k şekillerde
// yinelgen olarak birleştirilebilirler.
2016-04-25 08:57:21 +03:00
type Employee =
| Worker of Person
| Manager of Employee list
let jdoe = {First="John"; Last="Doe"}
let worker = Worker jdoe
// ------------------------------------
2016-04-26 02:02:07 +03:00
// Tipleri Kullanarak Modelleme
2016-04-25 08:57:21 +03:00
// ------------------------------------
2016-04-26 02:02:07 +03:00
// Union tipleri bayrak kullanmadan durum modelleme için harikadı r.
2016-04-25 08:57:21 +03:00
type EmailAddress =
| ValidEmailAddress of string
| InvalidEmailAddress of string
let trySendEmail email =
2016-04-26 02:02:07 +03:00
match email with // kalı p eşleştirme kullan
| ValidEmailAddress address -> () // gönder
| InvalidEmailAddress address -> () // gönderme
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// Union tiplerin record tiplerle birleşimi
// domain driven design için iyi bir temel oluşturur.
// Domain'i yansı tan yüzlerce ufak tip oluşturabilirsiniz.
2016-04-25 08:57:21 +03:00
type CartItem = { ProductCode: string; Qty: int }
type Payment = Payment of float
type ActiveCartData = { UnpaidItems: CartItem list }
type PaidCartData = { PaidItems: CartItem list; Payment: Payment}
type ShoppingCart =
2016-04-26 02:02:07 +03:00
| EmptyCart // veri yok
2016-04-25 08:57:21 +03:00
| ActiveCart of ActiveCartData
| PaidCart of PaidCartData
// ------------------------------------
2016-04-26 02:02:07 +03:00
// Tipler için içgüdüsel davranı ş
2016-04-25 08:57:21 +03:00
// ------------------------------------
2016-04-26 02:02:07 +03:00
// Çekirdek tipler kendinden çok kullanı şlı özelliklere sahiptir
// Ek kodlama gerektirmez
// * Değişmezlik
// * Debug ederken yazdı rma
// * Eşitlik ve kı yaslama
2016-04-25 08:57:21 +03:00
// * Serialization
2016-04-26 02:02:07 +03:00
// %A kullanarak yazdı rma
2016-04-25 08:57:21 +03:00
printfn "twoTuple=%A,\nPerson=%A,\nTemp=%A,\nEmployee=%A"
twoTuple person1 temp1 worker
2016-04-26 02:02:07 +03:00
// Eşitlik ve kı yaslama içgüdüseldir.
// İskambil kartları yla bir örnek
2016-04-25 08:57:21 +03:00
type Suit = Club | Diamond | Spade | Heart
type Rank = Two | Three | Four | Five | Six | Seven | Eight
| Nine | Ten | Jack | Queen | King | Ace
let hand = [ Club, Ace; Heart, Three; Heart, Ace;
Spade, Jack; Diamond, Two; Diamond, Ace ]
2016-04-26 02:02:07 +03:00
// Sı ralama
2016-04-25 08:57:21 +03:00
List.sort hand |> printfn "sorted hand is (low to high) %A"
List.max hand |> printfn "high card is %A"
List.min hand |> printfn "low card is %A"
// ================================================
2016-04-26 02:02:07 +03:00
// Aktif Kalı plar
2016-04-25 08:57:21 +03:00
// ================================================
module ActivePatternExamples =
2016-04-26 02:02:07 +03:00
// F# "aktif kalı plar" denen bir kalı p eşleştirmeye sahiptir.
// Kalı plar dinamik bir şekilde tespit edilip eşleştirilebilir.
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// Aktif kalı plar için söz dizimi (| ... |) şeklindedir
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// Örneğin, karakter tiplerini eşleyen bir "aktif" kalı p tanı mlayı n...
2016-04-25 08:57:21 +03:00
let (|Digit|Letter|Whitespace|Other|) ch =
if System.Char.IsDigit(ch) then Digit
else if System.Char.IsLetter(ch) then Letter
else if System.Char.IsWhiteSpace(ch) then Whitespace
else Other
2016-04-26 02:02:07 +03:00
// ... daha sonra eşleme mantı ğı çok daha net yapmak için bunu kullanı n
2016-04-25 08:57:21 +03:00
let printChar ch =
match ch with
| Digit -> printfn "%c is a Digit" ch
| Letter -> printfn "%c is a Letter" ch
| Whitespace -> printfn "%c is a Whitespace" ch
| _ -> printfn "%c is something else" ch
2016-04-26 02:02:07 +03:00
// Bir liste yazdı rma
2016-04-25 08:57:21 +03:00
['a'; 'b'; '1'; ' '; '-'; 'c'] |> List.iter printChar
// -----------------------------------
2016-04-26 02:02:07 +03:00
// Aktif Kalı pları Kullanarak FizzBuzz
2016-04-25 08:57:21 +03:00
// -----------------------------------
2016-04-26 02:02:07 +03:00
// Parçalı eşleşen kalı plar da oluşturabilirsiniz
// Tanı mda alt çizgi karakterini kullanı n ve eşleşince Some döndürün.
2016-04-25 08:57:21 +03:00
let (|MultOf3|_|) i = if i % 3 = 0 then Some MultOf3 else None
let (|MultOf5|_|) i = if i % 5 = 0 then Some MultOf5 else None
2016-04-26 02:02:07 +03:00
// Ana fonksiyon
2016-04-25 08:57:21 +03:00
let fizzBuzz i =
match i with
| MultOf3 & MultOf5 -> printf "FizzBuzz, "
| MultOf3 -> printf "Fizz, "
| MultOf5 -> printf "Buzz, "
| _ -> printf "%i, " i
// test
[1..20] |> List.iter fizzBuzz
// ================================================
2016-04-26 02:02:07 +03:00
// Sadelik
2016-04-25 08:57:21 +03:00
// ================================================
module AlgorithmExamples =
2016-04-26 02:02:07 +03:00
// F#'ı n sinyal/gürültü oranı yüksektir, dolayı sı yla
// kod algoritmayla hemen hemen aynı görünür.
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// ------ Örnek: sumOfSquares fonksiyonunu tanı mla ------
2016-04-25 08:57:21 +03:00
let sumOfSquares n =
2016-04-26 02:02:07 +03:00
[1..n] // 1) 1'den n'e kadar bütün sayı ları al
|> List.map square // 2) hepsinin karesini al
|> List.sum // 3) sonuçları topla
2016-04-25 08:57:21 +03:00
// test
sumOfSquares 100 |> printfn "Sum of squares = %A"
2016-04-26 02:02:07 +03:00
// ------ Örnek: bir sı ralama fonksiyonu tanı mla ------
2016-04-25 08:57:21 +03:00
let rec sort list =
match list with
2016-04-26 02:02:07 +03:00
// Liste boşsa
2016-04-25 08:57:21 +03:00
| [] ->
2016-04-26 02:02:07 +03:00
[] // boş listeyi döndür
// Liste boş değilse
| firstElem::otherElements -> // İlk elemanı al
let smallerElements = // Daha küçük elemanları
otherElements // diğerlerinden ayı r
2016-04-25 08:57:21 +03:00
|> List.filter (fun e -> e < firstElem )
2016-04-26 02:02:07 +03:00
|> sort // ve sı rala
let largerElements = // Daha büyük elemanları
otherElements // diğerlerinden ayı r
2016-04-25 08:57:21 +03:00
|> List.filter (fun e -> e >= firstElem)
2016-04-26 02:02:07 +03:00
|> sort // ve sı rala
// 3 parçayı birbirine ekle ve listeyi döndür
2016-04-25 08:57:21 +03:00
List.concat [smallerElements; [firstElem]; largerElements]
// test
sort [1; 5; 23; 18; 9; 1; 3] |> printfn "Sorted = %A"
// ================================================
2016-04-26 02:02:07 +03:00
// Eşzamanlı olmayan kod
2016-04-25 08:57:21 +03:00
// ================================================
module AsyncExample =
2016-04-26 02:02:07 +03:00
// F# "pyramid of doom" durumuyla karşı laştı rmayacak şekilde
// içgüdüsel eşzamanlı olmayan özelliklere sahiptir.
2016-04-25 08:57:21 +03:00
//
2016-04-26 02:02:07 +03:00
// Bir sonraki örnek bir web sayfası nı paralel bir şekilde indirir.
2016-04-25 08:57:21 +03:00
open System.Net
open System
open System.IO
open Microsoft.FSharp.Control.CommonExtensions
2016-04-26 02:02:07 +03:00
// İçeriği eşzamanlı olmayan bir şekilde getir
2016-04-25 08:57:21 +03:00
let fetchUrlAsync url =
2016-04-26 02:02:07 +03:00
async { // "async" anahtar kelimesi ve kı vrı k parantez
// "async (eşzamanlı olmayan)" nesneyi oluşturur
2016-04-25 08:57:21 +03:00
let req = WebRequest.Create(Uri(url))
use! resp = req.AsyncGetResponse()
2016-04-26 02:02:07 +03:00
// use! eşzamanlı olmayan atamadı r
2016-04-25 08:57:21 +03:00
use stream = resp.GetResponseStream()
2016-04-26 02:02:07 +03:00
// "use" kullanı lan bloğun dı şı na çı kı nca
// close()'u otomatik olarak tetikler
2016-04-25 08:57:21 +03:00
use reader = new IO.StreamReader(stream)
let html = reader.ReadToEnd()
printfn "finished downloading %s" url
}
2016-04-26 02:02:07 +03:00
// İndirmek için bir web sitesi listesi
2016-04-25 08:57:21 +03:00
let sites = ["http://www.bing.com";
"http://www.google.com";
"http://www.microsoft.com";
"http://www.amazon.com";
"http://www.yahoo.com"]
2016-04-26 02:02:07 +03:00
// İndir
2016-04-25 08:57:21 +03:00
sites
2016-04-26 02:02:07 +03:00
|> List.map fetchUrlAsync // async görevlerden oluşan bir liste yap
|> Async.Parallel // bu görevleri paralel çalı şacak şekilde ayarla
|> Async.RunSynchronously // başlat
2016-04-25 08:57:21 +03:00
// ================================================
2016-04-26 02:02:07 +03:00
// .NET uyumluluğu
2016-04-25 08:57:21 +03:00
// ================================================
module NetCompatibilityExamples =
2016-04-26 02:02:07 +03:00
// F#, C#'ı n yapabildiği hemen herşeyi yapabilir,
// ve .NET ve Mono kütüphaneleriyle tereyağı ndan kı l çeker gibi çalı şı r.
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// ------- var olan kütüphane fonksiyonları ile çalı şma -------
2016-04-25 08:57:21 +03:00
let (i1success, i1) = System.Int32.TryParse("123");
if i1success then printfn "parsed as %i" i1 else printfn "parse failed"
2016-04-26 02:02:07 +03:00
// ------- Arayüzleri yol üstünde tanı mla! -------
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// IDisposable'ı sağlayan yeni bir nesne oluştur
2016-04-25 08:57:21 +03:00
let makeResource name =
{ new System.IDisposable
with member this.Dispose() = printfn "%s disposed" name }
let useAndDisposeResources =
use r1 = makeResource "first resource"
printfn "using first resource"
for i in [1..3] do
let resourceName = sprintf "\tinner resource %d" i
use temp = makeResource resourceName
printfn "\tdo something with %s" resourceName
use r2 = makeResource "second resource"
printfn "using second resource"
printfn "done."
2016-04-26 02:02:07 +03:00
// ------- Nesne yönelimli kod -------
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// F# aynı zamanda tam bir nesne yönelimli dildir.
// Sı nı fları , kalı tı mı ve sanal metotları destekler.
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// Genel ipli bir arayüz
2016-04-25 08:57:21 +03:00
type IEnumerator< 'a> =
abstract member Current : 'a
abstract MoveNext : unit -> bool
2016-04-26 02:02:07 +03:00
// Sanal metotları olan soyut temel sı nı flar
2016-04-25 08:57:21 +03:00
[< AbstractClass > ]
type Shape() =
2016-04-26 02:02:07 +03:00
// sadece okunabilir özellikler
2016-04-25 08:57:21 +03:00
abstract member Width : int with get
abstract member Height : int with get
2016-04-26 02:02:07 +03:00
// sanal olmayan metot
2016-04-25 08:57:21 +03:00
member this.BoundingArea = this.Height * this.Width
2016-04-26 02:02:07 +03:00
// temel uygulaması yla bir sanal metot
2016-04-25 08:57:21 +03:00
abstract member Print : unit -> unit
default this.Print () = printfn "I'm a shape"
2016-04-26 02:02:07 +03:00
// Somut bir sı nı fı n soyut sı nı ftan kalı tı mı
2016-04-25 08:57:21 +03:00
type Rectangle(x:int, y:int) =
inherit Shape()
override this.Width = x
override this.Height = y
override this.Print () = printfn "I'm a Rectangle"
// test
let r = Rectangle(2, 3)
printfn "The width is %i" r.Width
printfn "The area is %i" r.BoundingArea
r.Print()
2016-04-26 02:02:07 +03:00
// ------- ekleme metotları -------
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
// C#'ta olduğu gibi F# da var olan sı nı fları ekleme metotları ile genişletebilir.
2016-04-25 08:57:21 +03:00
type System.String with
member this.StartsWithA = this.StartsWith "A"
// test
let s = "Alice"
printfn "'%s' starts with an 'A' = %A" s s.StartsWithA
2016-04-26 02:02:07 +03:00
// ------- olaylar -------
2016-04-25 08:57:21 +03:00
type MyButton() =
let clickEvent = new Event< _ > ()
[< CLIEvent > ]
member this.OnClick = clickEvent.Publish
member this.TestEvent(arg) =
clickEvent.Trigger(this, arg)
// test
let myButton = new MyButton()
myButton.OnClick.Add(fun (sender, arg) ->
printfn "Click event with arg=%O" arg)
myButton.TestEvent("Hello World!")
```
2016-04-26 02:02:07 +03:00
## Daha fazla bilgi
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
F# hakkı nda daha fazla demo için [Try F# ](http://www.tryfsharp.org/Learn ) sitesine gidin, veya benim (yazarı n) [why use F# ](http://fsharpforfunandprofit.com/why-use-fsharp/ ) serimi okuyun.
2016-04-25 08:57:21 +03:00
2016-04-26 02:02:07 +03:00
F# hakkı nda daha fazla bilgi için: [fsharp.org ](http://fsharp.org/ ).