Desen eşleştirme (F#)
Desenler giriş veri dönüştürme kurallardır. Mantıksal yapı veya yapıların verilerle karşılaştırmak, verileri oluşturan parçalara yönetilebilen ve dağıtılabilen ya da verileri çeşitli yollarla bilgi ayıklamak için F# dil kullanılırlar.
Notlar
Desenler kullanılır birçok dil yapıları içinde gibi match ifadesi. İşlevleri bağımsız değişkenler işlerken kullanıldıkları let bağları, lambda ifadeleri ve ilişkili özel durum işleyicilerini try...with ifadesi. Daha fazla bilgi için bkz. Eþleþme deyimleriyle (F#), Bağlar (F#) olanak sağlar, Lambda ifadeleri: Eğlenceli anahtar sözcüğü (F#) ve Özel durumlar: Try deyimi (F#) ile....
Örneğin, match ifadesi, pattern dikey çizgi simgesi aşağıda olur.
eşleşen expression ile
| pattern when condition -> result-expression
...
Her desen, Giriş bir şekilde dönüştürmek için bir kural olarak işlev görür. De match deyim, her desen incelenen sırayla giriş veri deseni ile uyumlu olup olmadığını görmek için. Bir eşleşme bulunamazsa, sonuç deyimi yürütülür. Bir eşleşme bulunamazsa, sonraki desen kural sınanır. İsteğe bağlı olduğunda condition bölümü açıklandığı Eþleþme deyimleriyle (F#).
Desteklenen desenleri aşağıdaki tabloda gösterilmiştir. Çalışma zamanında Giriş tablosunda listelenen sırada aşağıdaki desenleri karşı sınanır ve kodunuzu ve soldan sağa desenler için her satırda göründükleri gibi desenleri sürekli olarak uygulanır, öncelikle son arasındadır.
Ad |
Description |
Örnek |
---|---|---|
Sabit desen |
Herhangi bir sayısal, karakteri veya dize, bir numaralandırma sabiti veya tanımlanmış bir hazýr bilgi tanımlayıcı |
1.0, "test", 30, Color.Red |
Tanımlayıcı desen |
Discriminated Birliği, bir özel durum etiketi veya etkin desen case büyük/küçük harf değeri |
Some(x) Failure(msg) |
Değişken desen |
identifier |
a |
asDesen |
Desen olarak tanımlayıcısı |
(a, b) as tuple1 |
VEYA desen |
pattern1 | pattern2 |
([h] | [h; _]) |
VE desen |
pattern1 & pattern2 |
(a, b) & (_, "test") |
Olumsuz desen |
identifier :: list-identifier |
h :: t |
Liste desen |
[ pattern_1; ... ; pattern_n ] |
[ a; b; c ] |
Dizi desen |
[| pattern_1; ..; pattern_n ] |
[| a; b; c |] |
Parenthesized desen |
( pattern ) |
( a ) |
Kayıt düzeni desen |
( pattern_1, ... , pattern_n ) |
( a, b ) |
Kayıt düzeni |
{ identifier1 = pattern_1; ... ; identifier_n = pattern_n } |
{ Name = name; } |
Joker desen |
_ |
_ |
Tür ek açıklaması ile birlikte desen |
pattern : type |
a : int |
Tür sınama deseni |
:? type asidentifier |
:? System.DateTime as dt |
NULL desen |
null |
null |
Sabit desenleri
Sabit desenleri sayısal ve karakter dizelerini, numaralandırma (ile numaralandırma türü adı dahil) sabittir. A match diğer dillerde case deyimi yalnızca sabit desenleri deyim karşılaştırılabilir. Giriş sabit değerle karşılaştırılır ve değerleri aynıysa, deseni eşleştirir. Sabit değer türü giriş türüyle uyumlu olmalıdır.
Aşağıdaki örnek, harflerden oluşan desenler kullanımını gösterir ve ayrıca değişken bir desen veya desen kullanır.
[<Literal>]
let Three = 3
let filter123 x =
match x with
// The following line contains literal patterns combined with an OR pattern.
| 1 | 2 | Three -> printfn "Found 1, 2, or 3!"
// The following line contains a variable pattern.
| var1 -> printfn "%d" var1
for x in 1..10 do filter123 x
Başka bir hazýr bilgi desen numaralandırma sabitler üzerinde temel bir desen örneğidir. Numaralandırma sabitler kullandığınızda, numaralandırma türü adı belirtmeniz gerekir.
type Color =
| Red = 0
| Green = 1
| Blue = 2
let printColorName (color:Color) =
match color with
| Color.Red -> printfn "Red"
| Color.Green -> printfn "Green"
| Color.Blue -> printfn "Blue"
| _ -> ()
printColorName Color.Red
printColorName Color.Green
printColorName Color.Blue
Tanımlayıcı desenleri
Desen geçerli bir tanımlayıcı formları karakterden oluşan bir dize ise, tanımlayıcı formu desen nasıl eşleştirilir belirler. Tanımlayıcı tek bir karakter uzun ve büyük bir karakterle başlar, derleyici tanımlayıcı desen eşleştirme yapmak çalışır. Bu desen için tanımlayıcı hazýr bilgi özniteliði, discriminated Birliği büyük/küçük harf, bir özel durum tanımlayıcı veya desen etkin durumda işaretlenmiş bir değer olabilir. Eşleşen hiçbir tanımlayıcı bulunursa, eşleştirme başarısız olur ve değişken desen sonraki desen kuralı girişi karşılaştırılır.
Discriminated Birliği desenleri durumlarda adlı basit olabilir veya bir değer ya da birden çok değer içeren bir kayıt düzeni olabilir. Bir değer ise, değer için tanımlayıcı belirtmeniz gerekir veya kayıt düzeni olması durumunda, her bir kayıt düzeni öğesi için bir tanımlayıcı kayıt düzeni desenle sağlamanız gerekir. Bu bölümdeki örnekler için kod örnekleri konusuna bakın.
option Türü olan iki durumda olan discriminated UNION Some ve None. Bir servis talebi (Some) bir değer, ancak diğer sahiptir (None) yalnızca adlandırılmış bir durum. Bu nedenle, Some ile ilişkili değer bir değişken olması gerekir Some durumda, ancak None kendine yer almalıdır. Aşağıdaki kodda, değişken var1 eşleme tarafından elde edilen değer verilen Some durumda.
let printOption (data : int option) =
match data with
| Some var1 -> printfn "%d" var1
| None -> ()
Aşağıdaki örnekte, PersonName discriminated Birliği dizeleri ve adlarının olası formları temsil eden karakter bir karışımını içerir. Discriminated Birliği'nin durumlar var FirstOnly, LastOnly, ve FirstLast.
type PersonName =
| FirstOnly of string
| LastOnly of string
| FirstLast of string * string
let constructQuery personName =
match personName with
| FirstOnly(firstName) -> printf "May I call you %s?" firstName
| LastOnly(lastName) -> printf "Are you Mr. or Ms. %s?" lastName
| FirstLast(firstName, lastName) -> printf "Are you %s %s?" firstName lastName
Etkin desenleri daha karmaşık özel desen eşleştirme tanımlamanıza olanak sağlar. Etkin desenler hakkında daha fazla bilgi için bkz: Etkin desenleri (F#).
Tanımlayıcı bir istisna olduğu durumda desen eşleştirme özel durum işleyicilerini bağlamda kullanılır. Desen eşleştirme özel durum işleme hakkında daha fazla bilgi için bkz: Özel durumlar: Try deyimi (F#) ile....
Değişken desenleri
Değişken desen sağ tarafındaki yürütme ifadede kullanılabilecek bir değişken adı eşleşen değeri atar -> simgesi. Herhangi bir giriş başına bir değişken desenle eşleşen ancak değişken desenler bu nedenle dizilerini ve değişkenlere decomposed diziler gibi daha karmaşık yapıları etkinleştirme diğer desenleri içinde görülür.
Aşağıdaki örnek, kayıt düzeni deseni içinde değişken bir desen gösterir.
let function1 x =
match x with
| (var1, var2) when var1 > var2 -> printfn "%d is greater than %d" var1 var2
| (var1, var2) when var1 < var2 -> printfn "%d is less than %d" var1 var2
| (var1, var2) -> printfn "%d equals %d" var1 var2
function1 (1,2)
function1 (2, 1)
function1 (0, 0)
Desen olarak
as Olan bir desen desen olan bir as yan tümcesi eklenmiş. as Yan tümcesi yürütme ifadesinde kullanılan bir adla eşleşen değer bağlar bir match ifade veya burada bu desen kullanılan, büyük/küçük harf bir let bağlama, adı olarak yerel kapsam için bir bağlama eklenir.
Aşağıdaki örnek bir as desen.
let (var1, var2) as tuple1 = (1, 2)
printfn "%d %d %A" var1 var2 tuple1
VEYA desen
VEYA desen giriş verilerinin birden çok desen eşleştirir ve sonuç olarak aynı kodu çalıştırmak istediğinizde kullanılır. Her iki tarafın veya desenin türleri uyumlu olmalıdır.
Aşağıdaki örnek veya desen gösterir.
let detectZeroOR point =
match point with
| (0, 0) | (0, _) | (_, 0) -> printfn "Zero found."
| _ -> printfn "Both nonzero."
detectZeroOR (0, 0)
detectZeroOR (1, 0)
detectZeroOR (0, 10)
detectZeroOR (10, 15)
VE desen
VE desen giriş iki desen eşleşmesi gerekir. Her iki tarafında ve desen türleri uyumlu olmalıdır.
Aşağıdaki örnek bir duygu olduğunu detectZeroTuple gösterilen Kayıt düzeni desen daha sonra bu konuda, ancak burada her iki bölümde var1 ve var2 ve desen kullanarak değerleri olarak alınır.
let detectZeroAND point =
match point with
| (0, 0) -> printfn "Both values zero."
| (var1, var2) & (0, _) -> printfn "First value is 0 in (%d, %d)" var1 var2
| (var1, var2) & (_, 0) -> printfn "Second value is 0 in (%d, %d)" var1 var2
| _ -> printfn "Both nonzero."
detectZeroAND (0, 0)
detectZeroAND (1, 0)
detectZeroAND (0, 10)
detectZeroAND (10, 15)
Olumsuz desen
Olumsuz desen listesini ilk öğe yönetilebilen ve dağıtılabilen için kullanılan kafave geri kalan öğeleri içeren bir liste tail.
let list1 = [ 1; 2; 3; 4 ]
// This example uses a cons pattern and a list pattern.
let rec printList l =
match l with
| head :: tail -> printf "%d " head; printList tail
| [] -> printfn ""
printList list1
Liste desen
Liste desen öğeleri sayıya decomposed için listeleri sağlar. Yalnızca belirli sayıda öğe listeleri liste desen eşleştirir.
// This example uses a list pattern.
let listLength list =
match list with
| [] -> 0
| [ _ ] -> 1
| [ _; _ ] -> 2
| [ _; _; _ ] -> 3
| _ -> List.length list
printfn "%d" (listLength [ 1 ])
printfn "%d" (listLength [ 1; 1 ])
printfn "%d" (listLength [ 1; 1; 1; ])
printfn "%d" (listLength [ ] )
Dizi desen
Dizi desen listesi desen benzer ve belirli bir uzunlukta diziler yönetilebilen ve dağıtılabilen için kullanılabilir.
// This example uses array patterns.
let vectorLength vec =
match vec with
| [| var1 |] -> var1
| [| var1; var2 |] -> sqrt (var1*var1 + var2*var2)
| [| var1; var2; var3 |] -> sqrt (var1*var1 + var2*var2 + var3*var3)
| _ -> failwith "vectorLength called with an unsupported array size of %d." (vec.Length)
printfn "%f" (vectorLength [| 1. |])
printfn "%f" (vectorLength [| 1.; 1. |])
printfn "%f" (vectorLength [| 1.; 1.; 1.; |])
printfn "%f" (vectorLength [| |] )
Parenthesized desen
Parantez içinde istediğiniz birleşim elde etmek için desenler gruplandırılabilir. Aşağıdaki örnekte, parantez ve desen ve dezavantajlarını desen arasındaki birleşim denetlemek için kullanılır.
let countValues list value =
let rec checkList list acc =
match list with
| (elem1 & head) :: tail when elem1 = value -> checkList tail (acc + 1)
| head :: tail -> checkList tail acc
| [] -> acc
checkList list 0
let result = countValues [ for x in -10..10 -> x*x - 4 ] 0
printfn "%d" result
Kayıt düzeni desen
Kayıt düzeni desen giriş kayıt düzeni formunda eşleşir ve desen eşleştirme başlığın her pozisyonun değişkenleri kullanarak, kendisini oluşturan öğelerine decomposed kayıt düzeni sağlar.
Aşağıdaki örnek, kayıt düzeni desen gösterir ve harflerden oluşan desenler, değişken desenleri ve joker desen de kullanır.
let detectZeroTuple point =
match point with
| (0, 0) -> printfn "Both values zero."
| (0, var2) -> printfn "First value is 0 in (0, %d)" var2
| (var1, 0) -> printfn "Second value is 0 in (%d, 0)" var1
| _ -> printfn "Both nonzero."
detectZeroTuple (0, 0)
detectZeroTuple (1, 0)
detectZeroTuple (0, 10)
detectZeroTuple (10, 15)
Kayıt düzeni
Kayıt desen yönetilebilen ve dağıtılabilen alanların değerleri ayıklamak için kayıtlar için kullanılır. Desen kaydın tüm alanlarını başvurmak zorunda değildir; tüm alanlar, yalnızca tam olarak yer almayan ve değil ayıklanır.
// This example uses a record pattern.
type MyRecord = { Name: string; ID: int }
let IsMatchByName record1 (name: string) =
match record1 with
| { MyRecord.Name = nameFound; MyRecord.ID = _; } when nameFound = name -> true
| _ -> false
let recordX = { Name = "Parker"; ID = 10 }
let isMatched1 = IsMatchByName recordX "Parker"
let isMatched2 = IsMatchByName recordX "Hartono"
Joker desen
Joker desen çizgiyle gösterilir (_) karakter ve giriş yerine bir değişkene atanabilecek atılır dışında değişken desen gibi herhangi bir giriş eşleştirir. Joker desen genellikle diðer desenleri içinde yer tutucu olarak sağ tarafındaki ifade gerekmeyen değerler için kullanılan -> simgesi. Joker desen desenler listesi sonunda eşleşmeyen herhangi bir giriş eşleştirmek için de sık sık kullanılır. Joker desen, bu konudaki birçok kod örnekleri de gösterilmiştir. Yukarıdaki kod bir örnek için bkz.
Tür ek açıklamaları olan desenler
Desenler, tür ek açıklamaları olabilir. Bunlar diğer tür ek açıklamaları gibi davranır ve diğer tür ek açıklamaları gibi kesmesi Kılavuzu. Desenleri, tür ek açıklamaları etrafına parantez gerekir. Aşağıdaki kod, bir tür ek açıklaması bir desen gösterir.
let detect1 x =
match x with
| 1 -> printfn "Found a 1!"
| (var1 : int) -> printfn "%d" var1
detect1 0
detect1 1
Tür sınama deseni
Tür sınama deseni, giriş türü karşı eşleştirmek için kullanılır. Belirtilen desen, eşleşme türü (veya türetilmiş bir tür) eşleşen bir giriş türü ise, başarılı olur.
Aşağıdaki örnekte, tür sınama deseni gösterilmiştir.
open System.Windows.Forms
let RegisterControl(control:Control) =
match control with
| :? Button as button -> button.Text <- "Registered."
| :? CheckBox as checkbox -> checkbox.Text <- "Registered."
| _ -> ()
NULL desen
Null değere izin türleriyle çalışırken görünen değeri null deseni eşleştirir. NULL desenleri ile birlikte çalışma, sık kullanılan .NET Framework kod. Örneğin, dönüş değeri bir.net API giriş olabilir bir match ifadesi. Dönüş değeri null olup olmadığını ve ayrıca dönen değerin diğer özelliklere göre program akışını denetleyebilirsiniz. Null değerler programınızın geri kalanı için yayılmasını önlemek için null desen kullanabilirsiniz.
Aşağıdaki örnek, boş desen ve değişken desen kullanır.
let ReadFromFile (reader : System.IO.StreamReader) =
match reader.ReadLine() with
| null -> printfn "\n"; false
| line -> printfn "%s" line; true
let fs = System.IO.File.Open("..\..\Program.fs", System.IO.FileMode.Open)
let sr = new System.IO.StreamReader(fs)
while ReadFromFile(sr) = true do ()
sr.Close()