From ab4fa4ea02e29c8f680aa70a01da082c08cb11d8 Mon Sep 17 00:00:00 2001 From: Mustafa Zengin Date: Sun, 24 Apr 2016 22:57:21 -0700 Subject: fsharp translation to Turkish in progress --- tr-tr/fsharp-tr.html.markdown | 630 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 630 insertions(+) create mode 100644 tr-tr/fsharp-tr.html.markdown diff --git a/tr-tr/fsharp-tr.html.markdown b/tr-tr/fsharp-tr.html.markdown new file mode 100644 index 00000000..b844f552 --- /dev/null +++ b/tr-tr/fsharp-tr.html.markdown @@ -0,0 +1,630 @@ +--- +language: F# +contributors: + - ["Scott Wlaschin", "http://fsharpforfunandprofit.com/"] +translators: + - ["Mustafa Zengin", "http://zengin.github.com/"] +filename: learnfsharp.fs +--- + +F# fonksiyonel ve nesne tabanlı, genel amaçlı bir programlama dilidir. Bedava ve açık kaynaklıdır ve Linux, Mac, Windows ve dahasında çalışır. + +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 + +// ------ Printing ------ +// The printf/printfn functions are similar to the +// Console.Write/WriteLine functions in C#. +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] + +// There are also sprintf/sprintfn functions for formatting data +// into a string, similar to String.Format in C#. + +// ================================================ +// More on functions +// ================================================ + +// F# is a true functional language -- functions are first +// class entities and can be combined easily to make powerful +// constructs + +// Modules are used to group functions together +// Indentation is needed for each nested module. +module FunctionExamples = + + // define a simple adding function + let add x y = x + y + + // basic usage of a function + let a = add 1 2 + printfn "1 + 2 = %i" a + + // partial application to "bake in" parameters + let add42 = add 42 + let b = add42 1 + printfn "42 + 1 = %i" b + + // composition to combine functions + let add1 = add 1 + let add2 = add 2 + let add3 = add1 >> add2 + let c = add3 7 + printfn "3 + 7 = %i" c + + // higher order functions + [1..10] |> List.map add3 |> printfn "new list is %A" + + // lists of functions, and more + let add6 = [add1; add2; add3] |> List.reduce (>>) + let d = add6 7 + printfn "1 + 2 + 3 + 7 = %i" d + +// ================================================ +// Lists and collection +// ================================================ + +// There are three types of ordered collection: +// * Lists are most basic immutable collection. +// * Arrays are mutable and more efficient when needed. +// * Sequences are lazy and infinite (e.g. an enumerator). +// +// Other collections include immutable maps and sets +// plus all the standard .NET collections + +module ListExamples = + + // lists use square brackets + let list1 = ["a"; "b"] + let list2 = "c" :: list1 // :: is prepending + let list3 = list1 @ list2 // @ is concat + + // list comprehensions (aka generators) + let squares = [for i in 1..10 do yield i * i] + + // prime number generator + 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 + + // pattern matching for lists + 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 [] + + // recursion using lists + let rec sum aList = + match aList with + | [] -> 0 + | x::xs -> x + sum xs + sum [1..10] + + // ----------------------------------------- + // Standard library functions + // ----------------------------------------- + + // map + let add3 x = x + 3 + [1..10] |> List.map add3 + + // filter + let even x = x % 2 = 0 + [1..10] |> List.filter even + + // many more -- see documentation + +module ArrayExamples = + + // arrays use square brackets with bar + let array1 = [| "a"; "b" |] + let first = array1.[0] // indexed access using dot + + // pattern matching for arrays is same as for lists + 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 |] + + // Standard library functions just as for List + + [| 1..10 |] + |> Array.map (fun i -> i + 3) + |> Array.filter (fun i -> i % 2 = 0) + |> Array.iter (printfn "value is %i. ") + + +module SequenceExamples = + + // sequences use curly braces + let seq1 = seq { yield "a"; yield "b" } + + // sequences can use yield and + // can contain subsequences + let strange = seq { + // "yield" adds one element + yield 1; yield 2; + + // "yield!" adds a whole subsequence + yield! [5..10] + yield! seq { + for i in 1..10 do + if i % 2 = 0 then yield i }} + // test + strange |> Seq.toList + + + // Sequences can be created using "unfold" + // Here's the fibonacci series + 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 + + +// ================================================ +// Data Types +// ================================================ + +module DataTypeExamples = + + // All data is immutable by default + + // Tuples are quick 'n easy anonymous types + // -- Use a comma to create a tuple + let twoTuple = 1, 2 + let threeTuple = "a", 2, true + + // Pattern match to unpack + let x, y = twoTuple // sets x = 1, y = 2 + + // ------------------------------------ + // Record types have named fields + // ------------------------------------ + + // Use "type" with curly braces to define a record type + type Person = {First:string; Last:string} + + // Use "let" with curly braces to create a record + let person1 = {First="John"; Last="Doe"} + + // Pattern match to unpack + let {First = first} = person1 // sets first="John" + + // ------------------------------------ + // Union types (aka variants) have a set of choices + // Only case can be valid at a time. + // ------------------------------------ + + // Use "type" with bar/pipe to define a union type + type Temp = + | DegreesC of float + | DegreesF of float + + // Use one of the cases to create one + let temp1 = DegreesF 98.6 + let temp2 = DegreesC 37.0 + + // Pattern match on all cases to unpack + let printTemp = function + | DegreesC t -> printfn "%f degC" t + | DegreesF t -> printfn "%f degF" t + + printTemp temp1 + printTemp temp2 + + // ------------------------------------ + // Recursive types + // ------------------------------------ + + // Types can be combined recursively in complex ways + // without having to create subclasses + type Employee = + | Worker of Person + | Manager of Employee list + + let jdoe = {First="John"; Last="Doe"} + let worker = Worker jdoe + + // ------------------------------------ + // Modeling with types + // ------------------------------------ + + // Union types are great for modeling state without using flags + type EmailAddress = + | ValidEmailAddress of string + | InvalidEmailAddress of string + + let trySendEmail email = + match email with // use pattern matching + | ValidEmailAddress address -> () // send + | InvalidEmailAddress address -> () // don't send + + // The combination of union types and record types together + // provide a great foundation for domain driven design. + // You can create hundreds of little types that accurately + // reflect the domain. + + 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 = + | EmptyCart // no data + | ActiveCart of ActiveCartData + | PaidCart of PaidCartData + + // ------------------------------------ + // Built in behavior for types + // ------------------------------------ + + // Core types have useful "out-of-the-box" behavior, no coding needed. + // * Immutability + // * Pretty printing when debugging + // * Equality and comparison + // * Serialization + + // Pretty printing using %A + printfn "twoTuple=%A,\nPerson=%A,\nTemp=%A,\nEmployee=%A" + twoTuple person1 temp1 worker + + // Equality and comparison built in. + // Here's an example with cards. + 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 ] + + // sorting + 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" + + +// ================================================ +// Active patterns +// ================================================ + +module ActivePatternExamples = + + // F# has a special type of pattern matching called "active patterns" + // where the pattern can be parsed or detected dynamically. + + // "banana clips" are the syntax for active patterns + + // for example, define an "active" pattern to match character types... + 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 + + // ... and then use it to make parsing logic much clearer + 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 + + // print a list + ['a'; 'b'; '1'; ' '; '-'; 'c'] |> List.iter printChar + + // ----------------------------------- + // FizzBuzz using active patterns + // ----------------------------------- + + // You can create partial matching patterns as well + // Just use underscore in the definition, and return Some if matched. + let (|MultOf3|_|) i = if i % 3 = 0 then Some MultOf3 else None + let (|MultOf5|_|) i = if i % 5 = 0 then Some MultOf5 else None + + // the main function + 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 + +// ================================================ +// Conciseness +// ================================================ + +module AlgorithmExamples = + + // F# has a high signal/noise ratio, so code reads + // almost like the actual algorithm + + // ------ Example: define sumOfSquares function ------ + let sumOfSquares n = + [1..n] // 1) take all the numbers from 1 to n + |> List.map square // 2) square each one + |> List.sum // 3) sum the results + + // test + sumOfSquares 100 |> printfn "Sum of squares = %A" + + // ------ Example: define a sort function ------ + let rec sort list = + match list with + // If the list is empty + | [] -> + [] // return an empty list + // If the list is not empty + | firstElem::otherElements -> // take the first element + let smallerElements = // extract the smaller elements + otherElements // from the remaining ones + |> List.filter (fun e -> e < firstElem) + |> sort // and sort them + let largerElements = // extract the larger ones + otherElements // from the remaining ones + |> List.filter (fun e -> e >= firstElem) + |> sort // and sort them + // Combine the 3 parts into a new list and return it + List.concat [smallerElements; [firstElem]; largerElements] + + // test + sort [1; 5; 23; 18; 9; 1; 3] |> printfn "Sorted = %A" + +// ================================================ +// Asynchronous Code +// ================================================ + +module AsyncExample = + + // F# has built-in features to help with async code + // without encountering the "pyramid of doom" + // + // The following example downloads a set of web pages in parallel. + + open System.Net + open System + open System.IO + open Microsoft.FSharp.Control.CommonExtensions + + // Fetch the contents of a URL asynchronously + let fetchUrlAsync url = + async { // "async" keyword and curly braces + // creates an "async" object + let req = WebRequest.Create(Uri(url)) + use! resp = req.AsyncGetResponse() + // use! is async assignment + use stream = resp.GetResponseStream() + // "use" triggers automatic close() + // on resource at end of scope + use reader = new IO.StreamReader(stream) + let html = reader.ReadToEnd() + printfn "finished downloading %s" url + } + + // a list of sites to fetch + let sites = ["http://www.bing.com"; + "http://www.google.com"; + "http://www.microsoft.com"; + "http://www.amazon.com"; + "http://www.yahoo.com"] + + // do it + sites + |> List.map fetchUrlAsync // make a list of async tasks + |> Async.Parallel // set up the tasks to run in parallel + |> Async.RunSynchronously // start them off + +// ================================================ +// .NET compatibility +// ================================================ + +module NetCompatibilityExamples = + + // F# can do almost everything C# can do, and it integrates + // seamlessly with .NET or Mono libraries. + + // ------- work with existing library functions ------- + + let (i1success, i1) = System.Int32.TryParse("123"); + if i1success then printfn "parsed as %i" i1 else printfn "parse failed" + + // ------- Implement interfaces on the fly! ------- + + // create a new object that implements IDisposable + 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." + + // ------- Object oriented code ------- + + // F# is also a fully fledged OO language. + // It supports classes, inheritance, virtual methods, etc. + + // interface with generic type + type IEnumerator<'a> = + abstract member Current : 'a + abstract MoveNext : unit -> bool + + // abstract base class with virtual methods + [] + type Shape() = + // readonly properties + abstract member Width : int with get + abstract member Height : int with get + // non-virtual method + member this.BoundingArea = this.Height * this.Width + // virtual method with base implementation + abstract member Print : unit -> unit + default this.Print () = printfn "I'm a shape" + + // concrete class that inherits from base class and overrides + 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() + + // ------- extension methods ------- + + // Just as in C#, F# can extend existing classes with extension methods. + type System.String with + member this.StartsWithA = this.StartsWith "A" + + // test + let s = "Alice" + printfn "'%s' starts with an 'A' = %A" s s.StartsWithA + + // ------- events ------- + + type MyButton() = + let clickEvent = new Event<_>() + + [] + 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!") + +``` + +## More Information + +For more demonstrations of F#, go to the [Try F#](http://www.tryfsharp.org/Learn) site, or my [why use F#](http://fsharpforfunandprofit.com/why-use-fsharp/) series. + +Read more about F# at [fsharp.org](http://fsharp.org/). -- cgit v1.2.3 From 67a867ac0a96e6b5bdce8ab9cb700f3039741447 Mon Sep 17 00:00:00 2001 From: Mustafa Zengin Date: Mon, 25 Apr 2016 16:02:07 -0700 Subject: fsharp tutorial Turkish translation first pass complete --- tr-tr/fsharp-tr.html.markdown | 300 +++++++++++++++++++++--------------------- 1 file changed, 150 insertions(+), 150 deletions(-) diff --git a/tr-tr/fsharp-tr.html.markdown b/tr-tr/fsharp-tr.html.markdown index b844f552..828d7327 100644 --- a/tr-tr/fsharp-tr.html.markdown +++ b/tr-tr/fsharp-tr.html.markdown @@ -7,7 +7,7 @@ translators: filename: learnfsharp.fs --- -F# fonksiyonel ve nesne tabanlı, genel amaçlı bir programlama dilidir. Bedava ve açık kaynaklıdır ve Linux, Mac, Windows ve dahasında çalışır. +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. 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. @@ -106,84 +106,84 @@ let optionPatternMatch input = optionPatternMatch validValue optionPatternMatch invalidValue -// ------ Printing ------ -// The printf/printfn functions are similar to the -// Console.Write/WriteLine functions in C#. +// ------ Yazdırma ------ +// printf/printfn fonksiyonları C#'taki +// Console.Write/WriteLine fonksiyonlarına benzer. 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] -// There are also sprintf/sprintfn functions for formatting data -// into a string, similar to String.Format in C#. +// sprintf/sprintfn fonksiyonları ise veriyi string'e +// çevirmek içindir, C#'taki String.Format gibi. // ================================================ -// More on functions +// Fonksiyonlar hakkında dahası // ================================================ -// F# is a true functional language -- functions are first -// class entities and can be combined easily to make powerful -// constructs +// 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. -// Modules are used to group functions together -// Indentation is needed for each nested module. +// Modüller fonksiyonları gruplamak için kullanılır. +// Her bir modül için girinti gerekir. module FunctionExamples = - // define a simple adding function + // Temel bir ekleme fonksiyonu tanımla let add x y = x + y - // basic usage of a function + // Bir fonksiyonun temel kullanımı let a = add 1 2 printfn "1 + 2 = %i" a - // partial application to "bake in" parameters + // Parametreleri kaynaklamak için parçalı uygulama let add42 = add 42 let b = add42 1 printfn "42 + 1 = %i" b - // composition to combine functions + // Fonksiyonları birleştirmek için kompozisyon let add1 = add 1 let add2 = add 2 let add3 = add1 >> add2 let c = add3 7 printfn "3 + 7 = %i" c - // higher order functions + // Yüksek dereceli fonksiyonlar [1..10] |> List.map add3 |> printfn "new list is %A" - // lists of functions, and more + // Fonksiyonlar listesi ve dahası let add6 = [add1; add2; add3] |> List.reduce (>>) let d = add6 7 printfn "1 + 2 + 3 + 7 = %i" d // ================================================ -// Lists and collection +// Listeler ve kolleksiyonlar // ================================================ -// There are three types of ordered collection: -// * Lists are most basic immutable collection. -// * Arrays are mutable and more efficient when needed. -// * Sequences are lazy and infinite (e.g. an enumerator). -// -// Other collections include immutable maps and sets -// plus all the standard .NET collections +// Üç ç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. module ListExamples = - // lists use square brackets + // listeler köşeli parantez kullanır let list1 = ["a"; "b"] - let list2 = "c" :: list1 // :: is prepending - let list3 = list1 @ list2 // @ is concat + let list2 = "c" :: list1 // :: başa eleman ekler + let list3 = list1 @ list2 // @ listeleri birbirine ekler - // list comprehensions (aka generators) + // Liste comprehension'ları (jeneratörler olarak da bilinir) let squares = [for i in 1..10 do yield i * i] - // prime number generator + // asal sayı jeneratörü 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 - // pattern matching for lists + // Listelerle kalıp eşleştirme let listMatcher aList = match aList with | [] -> printfn "the list is empty" @@ -196,7 +196,7 @@ module ListExamples = listMatcher [1] listMatcher [] - // recursion using lists + // Listeleri kullanarak recursion let rec sum aList = match aList with | [] -> 0 @@ -204,7 +204,7 @@ module ListExamples = sum [1..10] // ----------------------------------------- - // Standard library functions + // Standart kütüphane fonksiyonları // ----------------------------------------- // map @@ -215,15 +215,15 @@ module ListExamples = let even x = x % 2 = 0 [1..10] |> List.filter even - // many more -- see documentation + // ve dahası -- dökümantasyonu bakınız module ArrayExamples = - // arrays use square brackets with bar + // Diziler köşeli parantezle birlikte çubuk karakterini kullanır let array1 = [| "a"; "b" |] - let first = array1.[0] // indexed access using dot + let first = array1.[0] // nokta kullanarak indeks erişimi - // pattern matching for arrays is same as for lists + // Diziler için kalıp eşleştirme listlerle aynıdır let arrayMatcher aList = match aList with | [| |] -> printfn "the array is empty" @@ -233,7 +233,7 @@ module ArrayExamples = arrayMatcher [| 1; 2; 3; 4 |] - // Standard library functions just as for List + // Listede olduğu gibi kütüphane fonksiyonları [| 1..10 |] |> Array.map (fun i -> i + 3) @@ -243,16 +243,16 @@ module ArrayExamples = module SequenceExamples = - // sequences use curly braces + // seriler kıvrık parantez kullanır let seq1 = seq { yield "a"; yield "b" } - // sequences can use yield and - // can contain subsequences + // seriler yield'ı kullanabilir + // ve alt seriler barındırabilir let strange = seq { - // "yield" adds one element + // "yield" bir eleman ekliyor yield 1; yield 2; - // "yield!" adds a whole subsequence + // "yield!" bütün bir alt seriyi ekliyor yield! [5..10] yield! seq { for i in 1..10 do @@ -261,8 +261,8 @@ module SequenceExamples = strange |> Seq.toList - // Sequences can be created using "unfold" - // Here's the fibonacci series + // Seriler "unfold" kullanılarak oluşturulabilir + // Fibonacci serisi örneği let fib = Seq.unfold (fun (fst,snd) -> Some(fst + snd, (snd, fst + snd))) (0,1) @@ -272,49 +272,49 @@ module SequenceExamples = // ================================================ -// Data Types +// Veri Tipleri // ================================================ module DataTypeExamples = - // All data is immutable by default + // Bütün veriler varsayılan olarak değiştirilemezdir. - // Tuples are quick 'n easy anonymous types - // -- Use a comma to create a tuple + // Tuple'lar çabuk ve kolay anonim tiplerdir. + // -- Tuple oluşturmak için virgül kullan let twoTuple = 1, 2 let threeTuple = "a", 2, true - // Pattern match to unpack - let x, y = twoTuple // sets x = 1, y = 2 + // paketi açmak için kalıp eşleştirme kullan + let x, y = twoTuple // x = 1, y = 2 // ------------------------------------ - // Record types have named fields + // Record tipi isimlendirilmiş alanlara sahiptir // ------------------------------------ - // Use "type" with curly braces to define a record type + // "type" ile kıvrık parantezleri record tipi oluşturmak için kullan type Person = {First:string; Last:string} - // Use "let" with curly braces to create a record + // "let" ile kıvrık parantezi record tipi oluşturmak için kullan let person1 = {First="John"; Last="Doe"} - // Pattern match to unpack - let {First = first} = person1 // sets first="John" + // paketi açmak için kalıp eşleştirme kullan + let {First = first} = person1 // first="John" // ------------------------------------ - // Union types (aka variants) have a set of choices - // Only case can be valid at a time. + // Union tipleri (değişkenler olarak da bilinir) birden fazla + // seçeneğe sahiptir. Belli bir zamanda sadece bir tanesi geçerlidir. // ------------------------------------ - // Use "type" with bar/pipe to define a union type + // "type" ile çubuk karakterini union tipi tanımlamak için kullan type Temp = | DegreesC of float | DegreesF of float - // Use one of the cases to create one + // Seçeneklerden birini kullan let temp1 = DegreesF 98.6 let temp2 = DegreesC 37.0 - // Pattern match on all cases to unpack + // Paketi açmak için bütün seçenekler üzerinde kalıp eşleştirme kullan let printTemp = function | DegreesC t -> printfn "%f degC" t | DegreesF t -> printfn "%f degF" t @@ -323,11 +323,11 @@ module DataTypeExamples = printTemp temp2 // ------------------------------------ - // Recursive types + // Yinelgen (Recursive) tipler // ------------------------------------ - // Types can be combined recursively in complex ways - // without having to create subclasses + // Tipler alt sınıflar oluşturmadan karmaşık şekillerde + // yinelgen olarak birleştirilebilirler. type Employee = | Worker of Person | Manager of Employee list @@ -336,23 +336,22 @@ module DataTypeExamples = let worker = Worker jdoe // ------------------------------------ - // Modeling with types + // Tipleri Kullanarak Modelleme // ------------------------------------ - // Union types are great for modeling state without using flags + // Union tipleri bayrak kullanmadan durum modelleme için harikadır. type EmailAddress = | ValidEmailAddress of string | InvalidEmailAddress of string let trySendEmail email = - match email with // use pattern matching - | ValidEmailAddress address -> () // send - | InvalidEmailAddress address -> () // don't send + match email with // kalıp eşleştirme kullan + | ValidEmailAddress address -> () // gönder + | InvalidEmailAddress address -> () // gönderme - // The combination of union types and record types together - // provide a great foundation for domain driven design. - // You can create hundreds of little types that accurately - // reflect the domain. + // 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. type CartItem = { ProductCode: string; Qty: int } type Payment = Payment of float @@ -360,26 +359,27 @@ module DataTypeExamples = type PaidCartData = { PaidItems: CartItem list; Payment: Payment} type ShoppingCart = - | EmptyCart // no data + | EmptyCart // veri yok | ActiveCart of ActiveCartData | PaidCart of PaidCartData // ------------------------------------ - // Built in behavior for types + // Tipler için içgüdüsel davranış // ------------------------------------ - // Core types have useful "out-of-the-box" behavior, no coding needed. - // * Immutability - // * Pretty printing when debugging - // * Equality and comparison + // Çekirdek tipler kendinden çok kullanışlı özelliklere sahiptir + // Ek kodlama gerektirmez + // * Değişmezlik + // * Debug ederken yazdırma + // * Eşitlik ve kıyaslama // * Serialization - // Pretty printing using %A + // %A kullanarak yazdırma printfn "twoTuple=%A,\nPerson=%A,\nTemp=%A,\nEmployee=%A" twoTuple person1 temp1 worker - // Equality and comparison built in. - // Here's an example with cards. + // Eşitlik ve kıyaslama içgüdüseldir. + // İskambil kartlarıyla bir örnek type Suit = Club | Diamond | Spade | Heart type Rank = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | Ace @@ -387,31 +387,31 @@ module DataTypeExamples = let hand = [ Club, Ace; Heart, Three; Heart, Ace; Spade, Jack; Diamond, Two; Diamond, Ace ] - // sorting + // Sıralama 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" // ================================================ -// Active patterns +// Aktif Kalıplar // ================================================ module ActivePatternExamples = - // F# has a special type of pattern matching called "active patterns" - // where the pattern can be parsed or detected dynamically. + // F# "aktif kalıplar" denen bir kalıp eşleştirmeye sahiptir. + // Kalıplar dinamik bir şekilde tespit edilip eşleştirilebilir. - // "banana clips" are the syntax for active patterns + // Aktif kalıplar için söz dizimi (| ... |) şeklindedir - // for example, define an "active" pattern to match character types... + // Örneğin, karakter tiplerini eşleyen bir "aktif" kalıp tanımlayın... 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 - // ... and then use it to make parsing logic much clearer + // ... daha sonra eşleme mantığı çok daha net yapmak için bunu kullanın let printChar ch = match ch with | Digit -> printfn "%c is a Digit" ch @@ -419,19 +419,19 @@ module ActivePatternExamples = | Whitespace -> printfn "%c is a Whitespace" ch | _ -> printfn "%c is something else" ch - // print a list + // Bir liste yazdırma ['a'; 'b'; '1'; ' '; '-'; 'c'] |> List.iter printChar // ----------------------------------- - // FizzBuzz using active patterns + // Aktif Kalıpları Kullanarak FizzBuzz // ----------------------------------- - // You can create partial matching patterns as well - // Just use underscore in the definition, and return Some if matched. + // 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. let (|MultOf3|_|) i = if i % 3 = 0 then Some MultOf3 else None let (|MultOf5|_|) i = if i % 5 = 0 then Some MultOf5 else None - // the main function + // Ana fonksiyon let fizzBuzz i = match i with | MultOf3 & MultOf5 -> printf "FizzBuzz, " @@ -443,106 +443,106 @@ module ActivePatternExamples = [1..20] |> List.iter fizzBuzz // ================================================ -// Conciseness +// Sadelik // ================================================ module AlgorithmExamples = - // F# has a high signal/noise ratio, so code reads - // almost like the actual algorithm + // F#'ın sinyal/gürültü oranı yüksektir, dolayısıyla + // kod algoritmayla hemen hemen aynı görünür. - // ------ Example: define sumOfSquares function ------ + // ------ Örnek: sumOfSquares fonksiyonunu tanımla ------ let sumOfSquares n = - [1..n] // 1) take all the numbers from 1 to n - |> List.map square // 2) square each one - |> List.sum // 3) sum the results + [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 // test sumOfSquares 100 |> printfn "Sum of squares = %A" - // ------ Example: define a sort function ------ + // ------ Örnek: bir sıralama fonksiyonu tanımla ------ let rec sort list = match list with - // If the list is empty + // Liste boşsa | [] -> - [] // return an empty list - // If the list is not empty - | firstElem::otherElements -> // take the first element - let smallerElements = // extract the smaller elements - otherElements // from the remaining ones + [] // 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 |> List.filter (fun e -> e < firstElem) - |> sort // and sort them - let largerElements = // extract the larger ones - otherElements // from the remaining ones + |> sort // ve sırala + let largerElements = // Daha büyük elemanları + otherElements // diğerlerinden ayır |> List.filter (fun e -> e >= firstElem) - |> sort // and sort them - // Combine the 3 parts into a new list and return it + |> sort // ve sırala + // 3 parçayı birbirine ekle ve listeyi döndür List.concat [smallerElements; [firstElem]; largerElements] // test sort [1; 5; 23; 18; 9; 1; 3] |> printfn "Sorted = %A" // ================================================ -// Asynchronous Code +// Eşzamanlı olmayan kod // ================================================ module AsyncExample = - // F# has built-in features to help with async code - // without encountering the "pyramid of doom" + // F# "pyramid of doom" durumuyla karşılaştırmayacak şekilde + // içgüdüsel eşzamanlı olmayan özelliklere sahiptir. // - // The following example downloads a set of web pages in parallel. + // Bir sonraki örnek bir web sayfasını paralel bir şekilde indirir. open System.Net open System open System.IO open Microsoft.FSharp.Control.CommonExtensions - // Fetch the contents of a URL asynchronously + // İçeriği eşzamanlı olmayan bir şekilde getir let fetchUrlAsync url = - async { // "async" keyword and curly braces - // creates an "async" object + async { // "async" anahtar kelimesi ve kıvrık parantez + // "async (eşzamanlı olmayan)" nesneyi oluşturur let req = WebRequest.Create(Uri(url)) use! resp = req.AsyncGetResponse() - // use! is async assignment + // use! eşzamanlı olmayan atamadır use stream = resp.GetResponseStream() - // "use" triggers automatic close() - // on resource at end of scope + // "use" kullanılan bloğun dışına çıkınca + // close()'u otomatik olarak tetikler use reader = new IO.StreamReader(stream) let html = reader.ReadToEnd() printfn "finished downloading %s" url } - // a list of sites to fetch + // İndirmek için bir web sitesi listesi let sites = ["http://www.bing.com"; "http://www.google.com"; "http://www.microsoft.com"; "http://www.amazon.com"; "http://www.yahoo.com"] - // do it + // İndir sites - |> List.map fetchUrlAsync // make a list of async tasks - |> Async.Parallel // set up the tasks to run in parallel - |> Async.RunSynchronously // start them off + |> 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 // ================================================ -// .NET compatibility +// .NET uyumluluğu // ================================================ module NetCompatibilityExamples = - // F# can do almost everything C# can do, and it integrates - // seamlessly with .NET or Mono libraries. + // F#, C#'ın yapabildiği hemen herşeyi yapabilir, + // ve .NET ve Mono kütüphaneleriyle tereyağından kıl çeker gibi çalışır. - // ------- work with existing library functions ------- + // ------- var olan kütüphane fonksiyonları ile çalışma ------- let (i1success, i1) = System.Int32.TryParse("123"); if i1success then printfn "parsed as %i" i1 else printfn "parse failed" - // ------- Implement interfaces on the fly! ------- + // ------- Arayüzleri yol üstünde tanımla! ------- - // create a new object that implements IDisposable + // IDisposable'ı sağlayan yeni bir nesne oluştur let makeResource name = { new System.IDisposable with member this.Dispose() = printfn "%s disposed" name } @@ -558,29 +558,29 @@ module NetCompatibilityExamples = printfn "using second resource" printfn "done." - // ------- Object oriented code ------- + // ------- Nesne yönelimli kod ------- - // F# is also a fully fledged OO language. - // It supports classes, inheritance, virtual methods, etc. + // F# aynı zamanda tam bir nesne yönelimli dildir. + // Sınıfları, kalıtımı ve sanal metotları destekler. - // interface with generic type + // Genel ipli bir arayüz type IEnumerator<'a> = abstract member Current : 'a abstract MoveNext : unit -> bool - // abstract base class with virtual methods + // Sanal metotları olan soyut temel sınıflar [] type Shape() = - // readonly properties + // sadece okunabilir özellikler abstract member Width : int with get abstract member Height : int with get - // non-virtual method + // sanal olmayan metot member this.BoundingArea = this.Height * this.Width - // virtual method with base implementation + // temel uygulamasıyla bir sanal metot abstract member Print : unit -> unit default this.Print () = printfn "I'm a shape" - // concrete class that inherits from base class and overrides + // Somut bir sınıfın soyut sınıftan kalıtımı type Rectangle(x:int, y:int) = inherit Shape() override this.Width = x @@ -593,9 +593,9 @@ module NetCompatibilityExamples = printfn "The area is %i" r.BoundingArea r.Print() - // ------- extension methods ------- + // ------- ekleme metotları ------- - // Just as in C#, F# can extend existing classes with extension methods. + // C#'ta olduğu gibi F# da var olan sınıfları ekleme metotları ile genişletebilir. type System.String with member this.StartsWithA = this.StartsWith "A" @@ -603,7 +603,7 @@ module NetCompatibilityExamples = let s = "Alice" printfn "'%s' starts with an 'A' = %A" s s.StartsWithA - // ------- events ------- + // ------- olaylar ------- type MyButton() = let clickEvent = new Event<_>() @@ -623,8 +623,8 @@ module NetCompatibilityExamples = ``` -## More Information +## Daha fazla bilgi -For more demonstrations of F#, go to the [Try F#](http://www.tryfsharp.org/Learn) site, or my [why use F#](http://fsharpforfunandprofit.com/why-use-fsharp/) series. +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. -Read more about F# at [fsharp.org](http://fsharp.org/). +F# hakkında daha fazla bilgi için: [fsharp.org](http://fsharp.org/). -- cgit v1.2.3 From 71cf39f9c20f09bfd9b7dd60f3ec577420b0709d Mon Sep 17 00:00:00 2001 From: Mustafa Zengin Date: Mon, 25 Apr 2016 19:22:56 -0700 Subject: translation within the code --- tr-tr/fsharp-tr.html.markdown | 400 +++++++++++++++++++++--------------------- 1 file changed, 200 insertions(+), 200 deletions(-) diff --git a/tr-tr/fsharp-tr.html.markdown b/tr-tr/fsharp-tr.html.markdown index 828d7327..c89b2e34 100644 --- a/tr-tr/fsharp-tr.html.markdown +++ b/tr-tr/fsharp-tr.html.markdown @@ -33,84 +33,84 @@ Aşağıdaki kodu denemek istiyorsanız, [tryfsharp.org](http://www.tryfsharp.or // "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 +let myString = "merhaba" // 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. +let ikidenBese = [2; 3; 4; 5] // Köşeli parantezler listeleri oluşturur, + // değerler ise noktalı virgülle ayrılır. +let birdenBese = 1 :: ikidenBese // :: yeni birinci elemanı olan bir liste oluşturur. // Sonuç: [1; 2; 3; 4; 5] -let zeroToFive = [0; 1] @ twoToFive // @ iki listeyi birbirine ekler. +let sifirdanBese = [0; 1] @ ikidenBese // @ 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 kare x = x * x // Parantez kullanılmadığına dikkat. +kare 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. +let topla x y = x + y // topla (x,y) kullanmayın! Bu tamamen başka bir anlama geliyor. +topla 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 +let ciftler liste = + let ciftMi x = x % 2 = 0 // "ciftMi"yi alt fonksiyon olarak tanımla + List.filter ciftMi liste // List.filter boolean bir fonksiyon ve + // üzerinde çalışılacak bir liste parametrelerinden oluşan + // bir kütüphane fonksiyonu -evens oneToFive // Şimdi fonksiyonu uygula. +evens birdenBese // Ş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] ) +// "map"i önce iki argümanla uygula, sonra sonuç üzerinde "ekle" uygula. +// Parantezler olmasaydı, "List.map" List.ekle'ın ilk argümanı olurdu. +let yuzeKadarKarelerinToplami = + List.ekle ( List.map kare [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ı +// Burada karelerToplami fonksiyonunun veri beslemeyle yazılmış hali var: +let veriBeslemeyleYuzeKadarKarelerinToplami = + [1..100] |> List.map kare |> List.ekle // "kare" ö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 +let funlaYuzeKadarKarelerinToplami = + [1..100] |> List.map (fun x -> x * x) |> List.ekle // 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 basitKalipEslestirme = 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 + | "a" -> printfn "x a'dır" + | "b" -> printfn "x b'dir" + | _ -> printfn "x başka bir şeydir" // 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 +let gecerliDeger = Some(99) +let gecersizDeger = 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 = +let optionKalipEslestirme input = match input with | Some i -> printfn "input is an int=%d" i | None -> printfn "input is missing" -optionPatternMatch validValue -optionPatternMatch invalidValue +optionKalipEslestirme gecerliDeger +optionKalipEslestirme gecersizDeger // ------ Yazdırma ------ // printf/printfn fonksiyonları C#'taki // Console.Write/WriteLine fonksiyonlarına benzer. -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] +printfn "Bir int %i, bir ondalık %f, bir boolean %b yazdırma" 1 2.0 true +printfn "Bir string %s, ve jenerik bir tip %A" "hello" [1; 2; 3; 4] // sprintf/sprintfn fonksiyonları ise veriyi string'e // çevirmek içindir, C#'taki String.Format gibi. @@ -125,33 +125,33 @@ printfn "A string %s, and something generic %A" "hello" [1; 2; 3; 4] // Modüller fonksiyonları gruplamak için kullanılır. // Her bir modül için girinti gerekir. -module FunctionExamples = +module FonksiyonOrnekleri = // Temel bir ekleme fonksiyonu tanımla - let add x y = x + y + let topla x y = x + y // Bir fonksiyonun temel kullanımı - let a = add 1 2 + let a = topla 1 2 printfn "1 + 2 = %i" a // Parametreleri kaynaklamak için parçalı uygulama - let add42 = add 42 - let b = add42 1 + let kirkIkiEkle = topla 42 + let b = kirkIkiEkle 1 printfn "42 + 1 = %i" b // Fonksiyonları birleştirmek için kompozisyon - let add1 = add 1 - let add2 = add 2 - let add3 = add1 >> add2 - let c = add3 7 + let birEkle = topla 1 + let ikiEkle = topla 2 + let ucEkle = birEkle >> ikiEkle + let c = ucEkle 7 printfn "3 + 7 = %i" c // Yüksek dereceli fonksiyonlar - [1..10] |> List.map add3 |> printfn "new list is %A" + [1..10] |> List.map ucEkle |> printfn "yeni liste: %A" // Fonksiyonlar listesi ve dahası - let add6 = [add1; add2; add3] |> List.reduce (>>) - let d = add6 7 + let altiEkle = [birEkle; ikiEkle; ucEkle] |> List.reduce (>>) + let d = altiEkle 7 printfn "1 + 2 + 3 + 7 = %i" d // ================================================ @@ -169,27 +169,27 @@ module FunctionExamples = module ListExamples = // listeler köşeli parantez kullanır - let list1 = ["a"; "b"] - let list2 = "c" :: list1 // :: başa eleman ekler - let list3 = list1 @ list2 // @ listeleri birbirine ekler + let liste1 = ["a"; "b"] + let liste2 = "c" :: liste1 // :: başa eleman ekler + let liste3 = liste1 @ liste2 // @ listeleri birbirine ekler // Liste comprehension'ları (jeneratörler olarak da bilinir) - let squares = [for i in 1..10 do yield i * i] + let kareler = [for i in 1..10 do yield i * i] // asal sayı jeneratörü - let rec sieve = function - | (p::xs) -> p :: sieve [ for x in xs do if x % p > 0 then yield x ] + let rec elek = function + | (p::xler) -> p :: elek [ for x in xler do if x % p > 0 then yield x ] | [] -> [] - let primes = sieve [2..50] - printfn "%A" primes + let asallar = elek [2..50] + printfn "%A" asallar // Listelerle kalıp eşleştirme - 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" + let listMatcher liste = + match liste with + | [] -> printfn "liste boş" + | [birinci] -> printfn "listede sadece bir eleman var: %A " birinci + | [birinci; ikinci] -> printfn "liste: %A ve %A" birinci ikinci + | _ -> printfn "listede ikiden fazla eleman var" listMatcher [1; 2; 3; 4] listMatcher [1; 2] @@ -197,58 +197,58 @@ module ListExamples = listMatcher [] // Listeleri kullanarak recursion - let rec sum aList = - match aList with + let rec ekle liste = + match liste with | [] -> 0 - | x::xs -> x + sum xs - sum [1..10] + | x::xler -> x + ekle xler + ekle [1..10] // ----------------------------------------- // Standart kütüphane fonksiyonları // ----------------------------------------- // map - let add3 x = x + 3 - [1..10] |> List.map add3 + let ucEkle x = x + 3 + [1..10] |> List.map ucEkle // filter - let even x = x % 2 = 0 - [1..10] |> List.filter even + let cift x = x % 2 = 0 + [1..10] |> List.filter cift - // ve dahası -- dökümantasyonu bakınız + // ve dahası -- dökümantasyona bakınız -module ArrayExamples = +module DiziOrnekleri = // Diziler köşeli parantezle birlikte çubuk karakterini kullanır - let array1 = [| "a"; "b" |] - let first = array1.[0] // nokta kullanarak indeks erişimi + let dizi1 = [| "a"; "b" |] + let birinci = dizi1.[0] // nokta kullanarak indeks erişimi // Diziler için kalıp eşleştirme listlerle aynıdır - 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" + let diziEslestirici liste = + match liste with + | [| |] -> printfn "dizi boş" + | [| birinci |] -> printfn "dizide sadece bir eleman var: %A " birinci + | [| birinci; ikinci |] -> printfn "dizi: %A ve %A" birinci ikinci + | _ -> printfn "dizide ikiden fazla eleman var" - arrayMatcher [| 1; 2; 3; 4 |] + diziEslestirici [| 1; 2; 3; 4 |] // Listede olduğu gibi kütüphane fonksiyonları [| 1..10 |] |> Array.map (fun i -> i + 3) |> Array.filter (fun i -> i % 2 = 0) - |> Array.iter (printfn "value is %i. ") + |> Array.iter (printfn "değer: %i. ") -module SequenceExamples = +module SeriOrnekleri = // seriler kıvrık parantez kullanır - let seq1 = seq { yield "a"; yield "b" } + let seri1 = seq { yield "a"; yield "b" } // seriler yield'ı kullanabilir // ve alt seriler barındırabilir - let strange = seq { + let garip = seq { // "yield" bir eleman ekliyor yield 1; yield 2; @@ -258,47 +258,47 @@ module SequenceExamples = for i in 1..10 do if i % 2 = 0 then yield i }} // test - strange |> Seq.toList + garip |> Seq.toList // Seriler "unfold" kullanılarak oluşturulabilir // Fibonacci serisi örneği - let fib = Seq.unfold (fun (fst,snd) -> - Some(fst + snd, (snd, fst + snd))) (0,1) + let fib = Seq.unfold (fun (birinci,ikinci) -> + Some(birinci + ikinci, (ikinci, birinci + ikinci))) (0,1) // test let fib10 = fib |> Seq.take 10 |> Seq.toList - printf "first 10 fibs are %A" fib10 + printf "ilk 10 fibonacci sayısı: %A" fib10 // ================================================ // Veri Tipleri // ================================================ -module DataTypeExamples = +module VeriTipiOrnekleri = // Bütün veriler varsayılan olarak değiştirilemezdir. // Tuple'lar çabuk ve kolay anonim tiplerdir. - // -- Tuple oluşturmak için virgül kullan - let twoTuple = 1, 2 - let threeTuple = "a", 2, true - // paketi açmak için kalıp eşleştirme kullan - let x, y = twoTuple // x = 1, y = 2 + let x, y = ikiliTuple // x = 1, y = 2 + + // -- Tuple oluşturmak için virgül kullan + let ikiliTuple = 1, 2 + let ucluTuple = "a", 2, true // ------------------------------------ // Record tipi isimlendirilmiş alanlara sahiptir // ------------------------------------ // "type" ile kıvrık parantezleri record tipi oluşturmak için kullan - type Person = {First:string; Last:string} + type Kisi = {birinci:string; Last:string} // "let" ile kıvrık parantezi record tipi oluşturmak için kullan - let person1 = {First="John"; Last="Doe"} + let kisi1 = {birinci="John"; Last="Doe"} // paketi açmak için kalıp eşleştirme kullan - let {First = first} = person1 // first="John" + let {birinci = birinci} = kisi1 // birinci="John" // ------------------------------------ // Union tipleri (değişkenler olarak da bilinir) birden fazla @@ -306,21 +306,21 @@ module DataTypeExamples = // ------------------------------------ // "type" ile çubuk karakterini union tipi tanımlamak için kullan - type Temp = - | DegreesC of float - | DegreesF of float + type Derece = + | Santigrat of float + | Fahrenhayt of float // Seçeneklerden birini kullan - let temp1 = DegreesF 98.6 - let temp2 = DegreesC 37.0 + let derece1 = Fahrenhayt 98.6 + let derece2 = Santigrat 37.0 // Paketi açmak için bütün seçenekler üzerinde kalıp eşleştirme kullan - let printTemp = function - | DegreesC t -> printfn "%f degC" t - | DegreesF t -> printfn "%f degF" t + let dereceYazdir = function + | Santigrat t -> printfn "%f C" t + | Fahrenhayt t -> printfn "%f F" t - printTemp temp1 - printTemp temp2 + dereceYazdir derece1 + dereceYazdir derece2 // ------------------------------------ // Yinelgen (Recursive) tipler @@ -328,40 +328,40 @@ module DataTypeExamples = // Tipler alt sınıflar oluşturmadan karmaşık şekillerde // yinelgen olarak birleştirilebilirler. - type Employee = - | Worker of Person - | Manager of Employee list + type Calisan = + | Isci of Kisi + | Yonetici of Calisan liste - let jdoe = {First="John"; Last="Doe"} - let worker = Worker jdoe + let falancaKisi = {birinci="John"; Last="Doe"} + let isci = Isci falancaKisi // ------------------------------------ // Tipleri Kullanarak Modelleme // ------------------------------------ // Union tipleri bayrak kullanmadan durum modelleme için harikadır. - type EmailAddress = - | ValidEmailAddress of string - | InvalidEmailAddress of string + type EpostaAdresi = + | GecerliEpostaAdresi of string + | GecersizEpostaAdresi of string - let trySendEmail email = - match email with // kalıp eşleştirme kullan - | ValidEmailAddress address -> () // gönder - | InvalidEmailAddress address -> () // gönderme + let epostaGondermeyiDene eposta = + match eposta with // kalıp eşleştirme kullan + | GecerliEpostaAdresi adres -> () // gönder + | GecersizEpostaAdresi adres -> () // gönderme // 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. - type CartItem = { ProductCode: string; Qty: int } - type Payment = Payment of float - type ActiveCartData = { UnpaidItems: CartItem list } - type PaidCartData = { PaidItems: CartItem list; Payment: Payment} + type Urun = { UrunKodu: string; Miktar: int } + type Odeme = Odeme of float + type AktifSepetVerisi = { OdenmemisUrunler: Urun liste } + type OndenmisSepetVerisi = { OdenmisUrunler: Urun liste; Odeme: Odeme} - type ShoppingCart = - | EmptyCart // veri yok - | ActiveCart of ActiveCartData - | PaidCart of PaidCartData + type AlisverisSepeti = + | BosSepet // veri yok + | AktifSepet of AktifSepetVerisi + | OdenmisSepet of OndenmisSepetVerisi // ------------------------------------ // Tipler için içgüdüsel davranış @@ -375,29 +375,29 @@ module DataTypeExamples = // * Serialization // %A kullanarak yazdırma - printfn "twoTuple=%A,\nPerson=%A,\nTemp=%A,\nEmployee=%A" - twoTuple person1 temp1 worker + printfn "ikiliTuple=%A,\nKisi=%A,\nDerece=%A,\nCalisan=%A" + ikiliTuple kisi1 derece1 isci // Eşitlik ve kıyaslama içgüdüseldir. // İskambil kartlarıyla bir örnek - type Suit = Club | Diamond | Spade | Heart - type Rank = Two | Three | Four | Five | Six | Seven | Eight - | Nine | Ten | Jack | Queen | King | Ace + type Simge = Sinek | Karo | Maca | Kupa + type Sira = Iki | Uc | Dort | Bes | Alti | Yedi | Sekiz + | Dokuz | On | Bacak | Kiz | Papaz | As - let hand = [ Club, Ace; Heart, Three; Heart, Ace; - Spade, Jack; Diamond, Two; Diamond, Ace ] + let el = [ Sinek, As; Kupa, Uc; Kupa, As; + Maca, Bacak; Karo, Iki; Karo, As ] // Sıralama - 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" + List.sirala el |> printfn "artarak dizilen el: %A" + List.max el |> printfn "en yüksek kart: %A" + List.min el |> printfn "en düşük kart: %A" // ================================================ // Aktif Kalıplar // ================================================ -module ActivePatternExamples = +module AktifKalipOrnekleri = // F# "aktif kalıplar" denen bir kalıp eşleştirmeye sahiptir. // Kalıplar dinamik bir şekilde tespit edilip eşleştirilebilir. @@ -405,22 +405,22 @@ module ActivePatternExamples = // Aktif kalıplar için söz dizimi (| ... |) şeklindedir // Örneğin, karakter tiplerini eşleyen bir "aktif" kalıp tanımlayın... - 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 + let (|Rakam|Harf|Bosluk|Diger|) karakter = + if System.Char.IsDigit(karakter) then Rakam + else if System.Char.IsLetter(karakter) then Harf + else if System.Char.IsWhiteSpace(karakter) then Bosluk + else Diger // ... daha sonra eşleme mantığı çok daha net yapmak için bunu kullanın - 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 + let karakterYazdir karakter = + match karakter with + | Rakam -> printfn "%c bir rakamdır" karakter + | Harf -> printfn "%c bir harftir" karakter + | Bosluk -> printfn "%c bir boşluktur" karakter + | _ -> printfn "%c başka bir şeydir" karakter // Bir liste yazdırma - ['a'; 'b'; '1'; ' '; '-'; 'c'] |> List.iter printChar + ['a'; 'b'; '1'; ' '; '-'; 'c'] |> List.iter karakterYazdir // ----------------------------------- // Aktif Kalıpları Kullanarak FizzBuzz @@ -428,15 +428,15 @@ module ActivePatternExamples = // 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. - let (|MultOf3|_|) i = if i % 3 = 0 then Some MultOf3 else None - let (|MultOf5|_|) i = if i % 5 = 0 then Some MultOf5 else None + let (|UcunKati|_|) i = if i % 3 = 0 then Some UcunKati else None + let (|BesinKati|_|) i = if i % 5 = 0 then Some BesinKati else None // Ana fonksiyon let fizzBuzz i = match i with - | MultOf3 & MultOf5 -> printf "FizzBuzz, " - | MultOf3 -> printf "Fizz, " - | MultOf5 -> printf "Buzz, " + | UcunKati & BesinKati -> printf "FizzBuzz, " + | UcunKati -> printf "Fizz, " + | BesinKati -> printf "Buzz, " | _ -> printf "%i, " i // test @@ -446,50 +446,50 @@ module ActivePatternExamples = // Sadelik // ================================================ -module AlgorithmExamples = +module AlgoritmaOrnekleri = // F#'ın sinyal/gürültü oranı yüksektir, dolayısıyla // kod algoritmayla hemen hemen aynı görünür. - // ------ Örnek: sumOfSquares fonksiyonunu tanımla ------ - let sumOfSquares n = - [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 + // ------ Örnek: karelerToplami fonksiyonunu tanımla ------ + let karelerToplami n = + [1..n] // 1) 1'den n'e kadar bütün sayıları al + |> List.map kare // 2) hepsinin karesini al + |> List.ekle // 3) sonuçları topla // test - sumOfSquares 100 |> printfn "Sum of squares = %A" + karelerToplami 100 |> printfn "kareler toplamı = %A" // ------ Örnek: bir sıralama fonksiyonu tanımla ------ - let rec sort list = - match list with + let rec sirala liste = + match liste with // Liste boşsa | [] -> - [] // boş listeyi döndür + [] // 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 - |> List.filter (fun e -> e < firstElem) - |> sort // ve sırala - let largerElements = // Daha büyük elemanları - otherElements // diğerlerinden ayır - |> List.filter (fun e -> e >= firstElem) - |> sort // ve sırala + | ilkEleman::digerElemanlar -> // İlk elemanı al + let kucukElemanlar = // Daha küçük elemanları + digerElemanlar // diğerlerinden ayır + |> List.filter (fun e -> e < ilkEleman) + |> sirala // ve sırala + let buyukElemanlar = // Daha büyük elemanları + digerElemanlar // diğerlerinden ayır + |> List.filter (fun e -> e >= ilkEleman) + |> sirala // ve sırala // 3 parçayı birbirine ekle ve listeyi döndür - List.concat [smallerElements; [firstElem]; largerElements] + List.concat [kucukElemanlar; [ilkEleman]; buyukElemanlar] // test - sort [1; 5; 23; 18; 9; 1; 3] |> printfn "Sorted = %A" + sirala [1; 5; 23; 18; 9; 1; 3] |> printfn "Sırala = %A" // ================================================ -// Eşzamanlı olmayan kod +// Eşzamansız kod // ================================================ -module AsyncExample = +module EszamansizOrnegi = // F# "pyramid of doom" durumuyla karşılaştırmayacak şekilde - // içgüdüsel eşzamanlı olmayan özelliklere sahiptir. + // içgüdüsel eşzamansız özelliklere sahiptir. // // Bir sonraki örnek bir web sayfasını paralel bir şekilde indirir. @@ -498,39 +498,39 @@ module AsyncExample = open System.IO open Microsoft.FSharp.Control.CommonExtensions - // İçeriği eşzamanlı olmayan bir şekilde getir - let fetchUrlAsync url = + // İçeriği eşzamansız bir şekilde getir + let eszamansizUrlGetir url = async { // "async" anahtar kelimesi ve kıvrık parantez - // "async (eşzamanlı olmayan)" nesneyi oluşturur - let req = WebRequest.Create(Uri(url)) - use! resp = req.AsyncGetResponse() - // use! eşzamanlı olmayan atamadır - use stream = resp.GetResponseStream() + // "async (eşzamansız)" nesneyi oluşturur + let istek = WebRequest.Create(Uri(url)) + use! cevap = istek.AsyncGetResponse() + // use! eşzamansız atamadır + use akis = cevap.GetResponseStream() // "use" kullanılan bloğun dışına çıkınca // close()'u otomatik olarak tetikler - use reader = new IO.StreamReader(stream) - let html = reader.ReadToEnd() - printfn "finished downloading %s" url + use okuyucu = new IO.StreamReader(akis) + let html = okuyucu.ReadToEnd() + printfn "İndirme tamamlandı: %s" url } // İndirmek için bir web sitesi listesi - let sites = ["http://www.bing.com"; + let siteler = ["http://www.bing.com"; "http://www.google.com"; "http://www.microsoft.com"; "http://www.amazon.com"; "http://www.yahoo.com"] // İndir - sites - |> 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 + siteler + |> List.map eszamansizUrlGetir // eşzamansız görevlerden oluşan bir liste yap + |> Async.Parallel // bu görevleri paralel çalışacak şekilde ayarla + |> Async.RunSynchronously // başlat // ================================================ // .NET uyumluluğu // ================================================ -module NetCompatibilityExamples = +module NetUyumlulukOrnekleri = // F#, C#'ın yapabildiği hemen herşeyi yapabilir, // ve .NET ve Mono kütüphaneleriyle tereyağından kıl çeker gibi çalışır. @@ -548,14 +548,14 @@ module NetCompatibilityExamples = with member this.Dispose() = printfn "%s disposed" name } let useAndDisposeResources = - use r1 = makeResource "first resource" - printfn "using first resource" + use r1 = makeResource "birinci resource" + printfn "using birinci 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" + use r2 = makeResource "ikinci resource" + printfn "using ikinci resource" printfn "done." // ------- Nesne yönelimli kod ------- @@ -616,7 +616,7 @@ module NetCompatibilityExamples = // test let myButton = new MyButton() - myButton.OnClick.Add(fun (sender, arg) -> + myButton.OnClick.topla(fun (sender, arg) -> printfn "Click event with arg=%O" arg) myButton.TestEvent("Hello World!") -- cgit v1.2.3 From 8bd2fd283a5441f8be1382c536fb443baf1ab911 Mon Sep 17 00:00:00 2001 From: Mustafa Zengin Date: Mon, 25 Apr 2016 22:34:41 -0700 Subject: fsharp turkish translation, translation for code piece is also complete --- tr-tr/fsharp-tr.html.markdown | 368 +++++++++++++++++++++--------------------- 1 file changed, 184 insertions(+), 184 deletions(-) diff --git a/tr-tr/fsharp-tr.html.markdown b/tr-tr/fsharp-tr.html.markdown index c89b2e34..d88e2594 100644 --- a/tr-tr/fsharp-tr.html.markdown +++ b/tr-tr/fsharp-tr.html.markdown @@ -4,7 +4,7 @@ contributors: - ["Scott Wlaschin", "http://fsharpforfunandprofit.com/"] translators: - ["Mustafa Zengin", "http://zengin.github.com/"] -filename: learnfsharp.fs +filename: learnfsharp-tr.fs --- 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. @@ -20,8 +20,8 @@ Aşağıdaki kodu denemek istiyorsanız, [tryfsharp.org](http://www.tryfsharp.or ```csharp -// tek satır yorumlar ikili bölme işareti kullanılır -(* çok satırlı yorumlar (* . . . *) ikilisini kullanır +// tek satır yorumlar ikili bölme işareti ile başlar +(* çok satırlı yorumlar ( * . . . * ) ikilisini kullanır -çok satırlı yorumun sonu- *) @@ -31,59 +31,59 @@ Aşağıdaki kodu denemek istiyorsanız, [tryfsharp.org](http://www.tryfsharp.or // ------ "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 = "merhaba" // tip bilgisi olmamasına dikkat +let tamsayım = 5 +let ondalığım = 3.14 +let stringim = "merhaba" // tip bilgisi olmamasına dikkat // ------ Listeler ------ -let ikidenBese = [2; 3; 4; 5] // Köşeli parantezler listeleri oluşturur, - // değerler ise noktalı virgülle ayrılır. -let birdenBese = 1 :: ikidenBese // :: yeni birinci elemanı olan bir liste oluşturur. +let ikidenBeşe = [2; 3; 4; 5] // Köşeli parantezler listeleri oluşturur, + // değerler ise noktalı virgülle ayrılır. +let birdenBeşe = 1 :: ikidenBeşe // :: yeni birinci elemanı olan bir liste oluşturur. // Sonuç: [1; 2; 3; 4; 5] -let sifirdanBese = [0; 1] @ ikidenBese // @ iki listeyi birbirine ekler. +let sıfırdanBeşe = [0; 1] @ ikidenBeşe // @ 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 kare x = x * x // Parantez kullanılmadığına dikkat. -kare 3 // Şimdi fonksiyonu uygula. Yine parantez yok. +kare 3 // Şimdi fonksiyonu uygulayın. Yine parantez yok. let topla x y = x + y // topla (x,y) kullanmayın! Bu tamamen başka bir anlama geliyor. -topla 2 3 // Şimdi fonksiyonu uygula. - -// çok satırlı bir fonksiyon tanımlamak için sadece girinti kullan. Noktalıı virgül gerekmez. -let ciftler liste = - let ciftMi x = x % 2 = 0 // "ciftMi"yi alt fonksiyon olarak tanımla - List.filter ciftMi liste // List.filter boolean bir fonksiyon ve - // üzerinde çalışılacak bir liste parametrelerinden oluşan - // bir kütüphane fonksiyonu +topla 2 3 // Şimdi fonksiyonu uygulayın. + +// çok satırlı bir fonksiyon tanımlamak için sadece girinti kullanın. Noktalı virgül gerekmez. +let çiftler liste = + let çiftMi x = x % 2 = 0 // "çiftMi"yi alt fonksiyon olarak tanımlayın + List.filter çiftMi liste // List.filter 'boolean bir fonksiyon' ve + // 'üzerinde çalışılacak bir liste' parametrelerinden oluşan + // bir kütüphane fonksiyonu -evens birdenBese // Şimdi fonksiyonu uygula. +çiftler birdenBeşe // Şimdi fonksiyonu uygula. -// Parantezleri önceliği netleştirmek için kullanabilirsin. Bu örnekte -// "map"i önce iki argümanla uygula, sonra sonuç üzerinde "ekle" uygula. -// Parantezler olmasaydı, "List.map" List.ekle'ın ilk argümanı olurdu. -let yuzeKadarKarelerinToplami = - List.ekle ( List.map kare [1..100] ) +// Parantezleri önceliği netleştirmek için kullanabilirsiniz. Bu örnek +// "map"i önce iki argümana, sonra sonuç üzerinde "ekle" uyguluyor. +// Parantezler olmasaydı, "List.map" List.sum'ın ilk argümanı olurdu. +let yüzeKadarKarelerinToplamı = + List.sum ( List.map kare [1..100] ) // Bir operasyonun sonucunu bir sonrakine "|>" kullanarak besleyebilirsin. // Veri beslemek F#'ta UNIX'te olduğu gibi yaygındır.. -// Burada karelerToplami fonksiyonunun veri beslemeyle yazılmış hali var: -let veriBeslemeyleYuzeKadarKarelerinToplami = - [1..100] |> List.map kare |> List.ekle // "kare" önceden tanımlanmıştı +// Burada yüzeKadarKarelerinToplamı fonksiyonunun veri beslemeyle yazılmış hali var: +let veriBeslemeyleYüzeKadarKarelerinToplamı = + [1..100] |> List.map kare |> List.sum // "kare" önceden tanımlanmıştı // Lambda'ları (anonim fonksiyonları) "fun" anahtar kelimesiyle tanımlayabilirsin -let funlaYuzeKadarKarelerinToplami = - [1..100] |> List.map (fun x -> x * x) |> List.ekle +let funlaYüzeKadarKarelerinToplamı = + [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 basitKalipEslestirme = +let basitKalıpEşleştirme = let x = "a" match x with | "a" -> printfn "x a'dır" @@ -93,24 +93,24 @@ let basitKalipEslestirme = // 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 gecerliDeger = Some(99) -let gecersizDeger = None +let geçerliDeğer = Some(99) +let geçersizDeğer = 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 optionKalipEslestirme input = +let optionKalıpEşleştirme input = match input with | Some i -> printfn "input is an int=%d" i | None -> printfn "input is missing" -optionKalipEslestirme gecerliDeger -optionKalipEslestirme gecersizDeger +optionKalıpEşleştirme geçerliDeğer +optionKalıpEşleştirme geçersizDeğer // ------ Yazdırma ------ // printf/printfn fonksiyonları C#'taki // Console.Write/WriteLine fonksiyonlarına benzer. -printfn "Bir int %i, bir ondalık %f, bir boolean %b yazdırma" 1 2.0 true -printfn "Bir string %s, ve jenerik bir tip %A" "hello" [1; 2; 3; 4] +printfn "Bir tamsayı %i, bir ondalık %f, bir boolean %b yazdırma" 1 2.0 true +printfn "Bir string %s, ve jenerik bir tip %A" "merhaba" [1; 2; 3; 4] // sprintf/sprintfn fonksiyonları ise veriyi string'e // çevirmek içindir, C#'taki String.Format gibi. @@ -135,23 +135,23 @@ module FonksiyonOrnekleri = printfn "1 + 2 = %i" a // Parametreleri kaynaklamak için parçalı uygulama - let kirkIkiEkle = topla 42 - let b = kirkIkiEkle 1 + let kırkİkiEkle = topla 42 + let b = kırkİkiEkle 1 printfn "42 + 1 = %i" b // Fonksiyonları birleştirmek için kompozisyon let birEkle = topla 1 let ikiEkle = topla 2 - let ucEkle = birEkle >> ikiEkle - let c = ucEkle 7 + let üçEkle = birEkle >> ikiEkle + let c = üçEkle 7 printfn "3 + 7 = %i" c // Yüksek dereceli fonksiyonlar - [1..10] |> List.map ucEkle |> printfn "yeni liste: %A" + [1..10] |> List.map üçEkle |> printfn "yeni liste: %A" // Fonksiyonlar listesi ve dahası - let altiEkle = [birEkle; ikiEkle; ucEkle] |> List.reduce (>>) - let d = altiEkle 7 + let altıEkle = [birEkle; ikiEkle; üçEkle] |> List.reduce (>>) + let d = altıEkle 7 printfn "1 + 2 + 3 + 7 = %i" d // ================================================ @@ -166,7 +166,7 @@ module FonksiyonOrnekleri = // Değiştirilmez map'ler ve kümeler ve bütün .NET kolleksiyonları // diğer kolleksiyon türleridir. -module ListExamples = +module ListeÖrnekleri = // listeler köşeli parantez kullanır let liste1 = ["a"; "b"] @@ -184,17 +184,17 @@ module ListExamples = printfn "%A" asallar // Listelerle kalıp eşleştirme - let listMatcher liste = + let listeEşleyici liste = match liste with | [] -> printfn "liste boş" | [birinci] -> printfn "listede sadece bir eleman var: %A " birinci | [birinci; ikinci] -> printfn "liste: %A ve %A" birinci ikinci | _ -> printfn "listede ikiden fazla eleman var" - listMatcher [1; 2; 3; 4] - listMatcher [1; 2] - listMatcher [1] - listMatcher [] + listeEşleyici [1; 2; 3; 4] + listeEşleyici [1; 2] + listeEşleyici [1] + listeEşleyici [] // Listeleri kullanarak recursion let rec ekle liste = @@ -208,30 +208,30 @@ module ListExamples = // ----------------------------------------- // map - let ucEkle x = x + 3 - [1..10] |> List.map ucEkle + let üçEkle x = x + 3 + [1..10] |> List.map üçEkle // filter - let cift x = x % 2 = 0 - [1..10] |> List.filter cift + let çift x = x % 2 = 0 + [1..10] |> List.filter çift // ve dahası -- dökümantasyona bakınız -module DiziOrnekleri = +module DiziÖrnekleri = // Diziler köşeli parantezle birlikte çubuk karakterini kullanır let dizi1 = [| "a"; "b" |] let birinci = dizi1.[0] // nokta kullanarak indeks erişimi // Diziler için kalıp eşleştirme listlerle aynıdır - let diziEslestirici liste = + let diziEşleştirici liste = match liste with | [| |] -> printfn "dizi boş" | [| birinci |] -> printfn "dizide sadece bir eleman var: %A " birinci | [| birinci; ikinci |] -> printfn "dizi: %A ve %A" birinci ikinci | _ -> printfn "dizide ikiden fazla eleman var" - diziEslestirici [| 1; 2; 3; 4 |] + diziEşleştirici [| 1; 2; 3; 4 |] // Listede olduğu gibi kütüphane fonksiyonları @@ -241,7 +241,7 @@ module DiziOrnekleri = |> Array.iter (printfn "değer: %i. ") -module SeriOrnekleri = +module SeriÖrnekleri = // seriler kıvrık parantez kullanır let seri1 = seq { yield "a"; yield "b" } @@ -275,38 +275,38 @@ module SeriOrnekleri = // Veri Tipleri // ================================================ -module VeriTipiOrnekleri = +module VeriTipiÖrnekleri = // Bütün veriler varsayılan olarak değiştirilemezdir. + // -- Tuple oluşturmak için virgül kullan + let ikiliTuple = 1, 2 + let üçlüTuple = "a", 2, true + // Tuple'lar çabuk ve kolay anonim tiplerdir. // paketi açmak için kalıp eşleştirme kullan let x, y = ikiliTuple // x = 1, y = 2 - // -- Tuple oluşturmak için virgül kullan - let ikiliTuple = 1, 2 - let ucluTuple = "a", 2, true - // ------------------------------------ // Record tipi isimlendirilmiş alanlara sahiptir // ------------------------------------ // "type" ile kıvrık parantezleri record tipi oluşturmak için kullan - type Kisi = {birinci:string; Last:string} + type Kişi = {Ad:string; Soyad:string} // "let" ile kıvrık parantezi record tipi oluşturmak için kullan - let kisi1 = {birinci="John"; Last="Doe"} + let kişi1 = {Ad="Falanca"; Soyad="Kişi"} // paketi açmak için kalıp eşleştirme kullan - let {birinci = birinci} = kisi1 // birinci="John" + let {Ad = Ad} = kişi1 // birinci="John" // ------------------------------------ // Union tipleri (değişkenler olarak da bilinir) birden fazla - // seçeneğe sahiptir. Belli bir zamanda sadece bir tanesi geçerlidir. + // seçeneğe sahiptir. Belli bir zamanda sadece bir tanesi geçerlidir. // ------------------------------------ // "type" ile çubuk karakterini union tipi tanımlamak için kullan - type Derece = + type Sıcaklık = | Santigrat of float | Fahrenhayt of float @@ -315,25 +315,25 @@ module VeriTipiOrnekleri = let derece2 = Santigrat 37.0 // Paketi açmak için bütün seçenekler üzerinde kalıp eşleştirme kullan - let dereceYazdir = function + let dereceYazdır = function | Santigrat t -> printfn "%f C" t | Fahrenhayt t -> printfn "%f F" t - dereceYazdir derece1 - dereceYazdir derece2 + dereceYazdır derece1 + dereceYazdır derece2 // ------------------------------------ // Yinelgen (Recursive) tipler // ------------------------------------ - // Tipler alt sınıflar oluşturmadan karmaşık şekillerde - // yinelgen olarak birleştirilebilirler. - type Calisan = - | Isci of Kisi - | Yonetici of Calisan liste + // Tipler alt sınıflar oluşturmadan karmaşık şekillerde + // yinelgen olarak birleştirilebilirler. + type Çalışan = + | İşçi of Kişi + | Yönetici of Çalışan list - let falancaKisi = {birinci="John"; Last="Doe"} - let isci = Isci falancaKisi + let falancaKişi = {Ad="Falanca"; Soyad="Kişi"} + let işçi = İşçi falancaKişi // ------------------------------------ // Tipleri Kullanarak Modelleme @@ -341,54 +341,54 @@ module VeriTipiOrnekleri = // Union tipleri bayrak kullanmadan durum modelleme için harikadır. type EpostaAdresi = - | GecerliEpostaAdresi of string - | GecersizEpostaAdresi of string + | GeçerliEpostaAdresi of string + | GeçersizEpostaAdresi of string - let epostaGondermeyiDene eposta = - match eposta with // kalıp eşleştirme kullan - | GecerliEpostaAdresi adres -> () // gönder - | GecersizEpostaAdresi adres -> () // gönderme + let epostaGöndermeyiDene eposta = + match eposta with // kalıp eşleştirme kullan + | GeçerliEpostaAdresi adres -> () // gönder + | GeçersizEpostaAdresi adres -> () // gönderme - // Union tiplerin record tiplerle birleşimi - // domain driven design için iyi bir temel oluşturur. + // 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. - type Urun = { UrunKodu: string; Miktar: int } - type Odeme = Odeme of float - type AktifSepetVerisi = { OdenmemisUrunler: Urun liste } - type OndenmisSepetVerisi = { OdenmisUrunler: Urun liste; Odeme: Odeme} + type Ürün = { ÜrünKodu: string; Miktar: int } + type Ödeme = Ödeme of float + type AktifSepetVerisi = { ÖdenmemişÜrünler: Ürün list } + type ÖdenmişSepetVerisi = { ÖdenmişÜrünler: Ürün list; Ödeme: Ödeme} - type AlisverisSepeti = + type AlışverişSepeti = | BosSepet // veri yok | AktifSepet of AktifSepetVerisi - | OdenmisSepet of OndenmisSepetVerisi + | ÖdenmişSepet of ÖdenmişSepetVerisi // ------------------------------------ // Tipler için içgüdüsel davranış // ------------------------------------ // Çekirdek tipler kendinden çok kullanışlı özelliklere sahiptir - // Ek kodlama gerektirmez + // Ek kodlama gerektirmez // * Değişmezlik // * Debug ederken yazdırma // * Eşitlik ve kıyaslama // * Serialization // %A kullanarak yazdırma - printfn "ikiliTuple=%A,\nKisi=%A,\nDerece=%A,\nCalisan=%A" - ikiliTuple kisi1 derece1 isci + printfn "ikiliTuple=%A,\nKişi=%A,\Sıcaklık=%A,\nÇalışan=%A" + ikiliTuple kişi1 derece1 işçi // Eşitlik ve kıyaslama içgüdüseldir. // İskambil kartlarıyla bir örnek - type Simge = Sinek | Karo | Maca | Kupa - type Sira = Iki | Uc | Dort | Bes | Alti | Yedi | Sekiz - | Dokuz | On | Bacak | Kiz | Papaz | As + type Simge = Sinek | Karo | Maça | Kupa + type Sıra = İki | Üç | Dört | Beş | Altı | Yedi | Sekiz + | Dokuz | On | Bacak | Kız | Papaz | As - let el = [ Sinek, As; Kupa, Uc; Kupa, As; - Maca, Bacak; Karo, Iki; Karo, As ] + let el = [ Sinek, As; Kupa, Üç; Kupa, As; + Maça, Bacak; Karo, İki; Karo, As ] // Sıralama - List.sirala el |> printfn "artarak dizilen el: %A" + List.sort el |> printfn "artarak dizilen el: %A" List.max el |> printfn "en yüksek kart: %A" List.min el |> printfn "en düşük kart: %A" @@ -397,7 +397,7 @@ module VeriTipiOrnekleri = // Aktif Kalıplar // ================================================ -module AktifKalipOrnekleri = +module AktifKalıpÖrnekleri = // F# "aktif kalıplar" denen bir kalıp eşleştirmeye sahiptir. // Kalıplar dinamik bir şekilde tespit edilip eşleştirilebilir. @@ -405,38 +405,38 @@ module AktifKalipOrnekleri = // Aktif kalıplar için söz dizimi (| ... |) şeklindedir // Örneğin, karakter tiplerini eşleyen bir "aktif" kalıp tanımlayın... - let (|Rakam|Harf|Bosluk|Diger|) karakter = + let (|Rakam|Harf|Boşluk|Diğer|) karakter = if System.Char.IsDigit(karakter) then Rakam else if System.Char.IsLetter(karakter) then Harf - else if System.Char.IsWhiteSpace(karakter) then Bosluk - else Diger + else if System.Char.IsWhiteSpace(karakter) then Boşluk + else Diğer // ... daha sonra eşleme mantığı çok daha net yapmak için bunu kullanın - let karakterYazdir karakter = + let karakterYazdır karakter = match karakter with | Rakam -> printfn "%c bir rakamdır" karakter | Harf -> printfn "%c bir harftir" karakter - | Bosluk -> printfn "%c bir boşluktur" karakter + | Boşluk -> printfn "%c bir boşluktur" karakter | _ -> printfn "%c başka bir şeydir" karakter // Bir liste yazdırma - ['a'; 'b'; '1'; ' '; '-'; 'c'] |> List.iter karakterYazdir + ['a'; 'b'; '1'; ' '; '-'; 'c'] |> List.iter karakterYazdır // ----------------------------------- // Aktif Kalıpları Kullanarak FizzBuzz // ----------------------------------- - // Parçalı eşleşen kalıplar da oluşturabilirsiniz + // 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. - let (|UcunKati|_|) i = if i % 3 = 0 then Some UcunKati else None - let (|BesinKati|_|) i = if i % 5 = 0 then Some BesinKati else None + let (|ÜçünKatı|_|) i = if i % 3 = 0 then Some ÜçünKatı else None + let (|BeşinKatı|_|) i = if i % 5 = 0 then Some BeşinKatı else None // Ana fonksiyon let fizzBuzz i = match i with - | UcunKati & BesinKati -> printf "FizzBuzz, " - | UcunKati -> printf "Fizz, " - | BesinKati -> printf "Buzz, " + | ÜçünKatı & BeşinKatı -> printf "FizzBuzz, " + | ÜçünKatı -> printf "Fizz, " + | BeşinKatı -> printf "Buzz, " | _ -> printf "%i, " i // test @@ -446,50 +446,50 @@ module AktifKalipOrnekleri = // Sadelik // ================================================ -module AlgoritmaOrnekleri = +module AlgoritmaÖrnekleri = // F#'ın sinyal/gürültü oranı yüksektir, dolayısıyla // kod algoritmayla hemen hemen aynı görünür. // ------ Örnek: karelerToplami fonksiyonunu tanımla ------ - let karelerToplami n = - [1..n] // 1) 1'den n'e kadar bütün sayıları al - |> List.map kare // 2) hepsinin karesini al - |> List.ekle // 3) sonuçları topla + let karelerToplamı n = + [1..n] // 1) 1'den n'e kadar bütün sayıları al + |> List.map kare // 2) hepsinin karesini al + |> List.sum // 3) sonuçları topla // test - karelerToplami 100 |> printfn "kareler toplamı = %A" + karelerToplamı 100 |> printfn "kareler toplamı = %A" // ------ Örnek: bir sıralama fonksiyonu tanımla ------ - let rec sirala liste = + let rec sırala liste = match liste with // Liste boşsa | [] -> - [] // boş listeyi döndür + [] // boş listeyi döndür // Liste boş değilse - | ilkEleman::digerElemanlar -> // İlk elemanı al - let kucukElemanlar = // Daha küçük elemanları - digerElemanlar // diğerlerinden ayır + | ilkEleman::diğerElemanlar -> // İlk elemanı al + let küçükElemanlar = // Daha küçük elemanları + diğerElemanlar // diğerlerinden ayır |> List.filter (fun e -> e < ilkEleman) - |> sirala // ve sırala - let buyukElemanlar = // Daha büyük elemanları - digerElemanlar // diğerlerinden ayır + |> sırala // ve sırala + let büyükElemanlar = // Daha büyük elemanları + diğerElemanlar // diğerlerinden ayır |> List.filter (fun e -> e >= ilkEleman) - |> sirala // ve sırala + |> sırala // ve sırala // 3 parçayı birbirine ekle ve listeyi döndür - List.concat [kucukElemanlar; [ilkEleman]; buyukElemanlar] + List.concat [küçükElemanlar; [ilkEleman]; büyükElemanlar] // test - sirala [1; 5; 23; 18; 9; 1; 3] |> printfn "Sırala = %A" + sırala [1; 5; 23; 18; 9; 1; 3] |> printfn "Sırala = %A" // ================================================ // Eşzamansız kod // ================================================ -module EszamansizOrnegi = +module EşzamansızÖrneği = // F# "pyramid of doom" durumuyla karşılaştırmayacak şekilde - // içgüdüsel eşzamansız özelliklere sahiptir. + // içgüdüsel eşzamansız özelliklere sahiptir. // // Bir sonraki örnek bir web sayfasını paralel bir şekilde indirir. @@ -499,16 +499,16 @@ module EszamansizOrnegi = open Microsoft.FSharp.Control.CommonExtensions // İçeriği eşzamansız bir şekilde getir - let eszamansizUrlGetir url = + let eşzamansızUrlGetir url = async { // "async" anahtar kelimesi ve kıvrık parantez // "async (eşzamansız)" nesneyi oluşturur let istek = WebRequest.Create(Uri(url)) use! cevap = istek.AsyncGetResponse() // use! eşzamansız atamadır - use akis = cevap.GetResponseStream() + use akış = cevap.GetResponseStream() // "use" kullanılan bloğun dışına çıkınca // close()'u otomatik olarak tetikler - use okuyucu = new IO.StreamReader(akis) + use okuyucu = new IO.StreamReader(akış) let html = okuyucu.ReadToEnd() printfn "İndirme tamamlandı: %s" url } @@ -522,76 +522,76 @@ module EszamansizOrnegi = // İndir siteler - |> List.map eszamansizUrlGetir // eşzamansız görevlerden oluşan bir liste yap - |> Async.Parallel // bu görevleri paralel çalışacak şekilde ayarla - |> Async.RunSynchronously // başlat + |> List.map eşzamansızUrlGetir // eşzamansız görevlerden oluşan bir liste yap + |> Async.Parallel // bu görevleri paralel çalışacak şekilde ayarla + |> Async.RunSynchronously // başlat // ================================================ // .NET uyumluluğu // ================================================ -module NetUyumlulukOrnekleri = +module NetUyumlulukÖrnekleri = // F#, C#'ın yapabildiği hemen herşeyi yapabilir, // ve .NET ve Mono kütüphaneleriyle tereyağından kıl çeker gibi çalışır. // ------- var olan kütüphane fonksiyonları ile çalışma ------- - let (i1success, i1) = System.Int32.TryParse("123"); - if i1success then printfn "parsed as %i" i1 else printfn "parse failed" + let (i1başarılı, i1) = System.Int32.TryParse("123"); + if i1başarılı then printfn "%i olarak dönüştürüldü" i1 else printfn "dönüştürme başarısız" - // ------- Arayüzleri yol üstünde tanımla! ------- + // ------- Arayüzleri yol üstünde tanımlayın! ------- // IDisposable'ı sağlayan yeni bir nesne oluştur - let makeResource name = + let kaynakOluştur isim = { new System.IDisposable - with member this.Dispose() = printfn "%s disposed" name } + with member this.Dispose() = printfn "%s atıldı" isim } - let useAndDisposeResources = - use r1 = makeResource "birinci resource" - printfn "using birinci resource" + let kaynakKullanVeAt = + use r1 = kaynakOluştur "birinci kaynak" + printfn "birinci kaynağı kullanıyor" 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 "ikinci resource" - printfn "using ikinci resource" - printfn "done." + let kaynakİsmi = sprintf "\tiç kaynak %d" i + use geçici = kaynakOluştur kaynakİsmi + printfn "\t%s ile bir şey yap" kaynakİsmi + use r2 = kaynakOluştur "ikinci kaynak" + printfn "ikinci kaynağı kullanıyor" + printfn "bitti." // ------- Nesne yönelimli kod ------- // F# aynı zamanda tam bir nesne yönelimli dildir. // Sınıfları, kalıtımı ve sanal metotları destekler. - // Genel ipli bir arayüz + // Genel tipli bir arayüz type IEnumerator<'a> = - abstract member Current : 'a - abstract MoveNext : unit -> bool + abstract member Şimdiki : 'a + abstract SonrakineGeç : unit -> bool // Sanal metotları olan soyut temel sınıflar [] - type Shape() = + type Şekil() = // sadece okunabilir özellikler - abstract member Width : int with get - abstract member Height : int with get + abstract member Genişlik : int with get + abstract member Yükseklik : int with get // sanal olmayan metot - member this.BoundingArea = this.Height * this.Width + member this.ÇevreleyenAlan = this.Yükseklik * this.Genişlik // temel uygulamasıyla bir sanal metot - abstract member Print : unit -> unit - default this.Print () = printfn "I'm a shape" + abstract member Yazdır : unit -> unit + default this.Yazdır () = printfn "Ben bir şekil (önümden çekil!)" // Somut bir sınıfın soyut sınıftan kalıtımı - type Rectangle(x:int, y:int) = - inherit Shape() - override this.Width = x - override this.Height = y - override this.Print () = printfn "I'm a Rectangle" + type Dikdörtgen(x:int, y:int) = + inherit Şekil() + override this.Genişlik = x + override this.Yükseklik = y + override this.Yazdır () = printfn "Ben bir dikdörtgenim" // test - let r = Rectangle(2, 3) - printfn "The width is %i" r.Width - printfn "The area is %i" r.BoundingArea - r.Print() + let r = Dikdörtgen(2, 3) + printfn "Genişlik: %i" r.Genişlik + printfn "Çevreleyen Alan: %i" r.ÇevreleyenAlan + r.Yazdır() // ------- ekleme metotları ------- @@ -600,26 +600,26 @@ module NetUyumlulukOrnekleri = member this.StartsWithA = this.StartsWith "A" // test - let s = "Alice" - printfn "'%s' starts with an 'A' = %A" s s.StartsWithA + let s = "Ahmet" + printfn "'%s' 'A' ile başlar = %A" s s.StartsWithA // ------- olaylar ------- - type MyButton() = - let clickEvent = new Event<_>() + type Butonum() = + let tıklamaOlayı = new Event<_>() [] - member this.OnClick = clickEvent.Publish + member this.OnClick = tıklamaOlayı.Publish - member this.TestEvent(arg) = - clickEvent.Trigger(this, arg) + member this.DenemeOlayı(arg) = + tıklamaOlayı.Trigger(this, arg) // test - let myButton = new MyButton() - myButton.OnClick.topla(fun (sender, arg) -> - printfn "Click event with arg=%O" arg) + let butonum = new Butonum() + butonum.OnClick.Add(fun (sender, arg) -> + printfn "arg=%O ile beraber bir tıklama olayı" arg) - myButton.TestEvent("Hello World!") + butonum.DenemeOlayı("Merhaba Dünya!") ``` -- cgit v1.2.3