Diziler (F#)
A sıra mantıksal bir dizi öğelerinin tümü, bir tür.Büyük bir veri toplama sipariş var ancak mutlaka tüm öğeleri kullanmayı düşünmüyorsanız, serileri özellikle yararlı olur.Tek tek sıra öğeleri yalnızca olarak hesaplanan bir sıra listesi tüm öğeleri kullanılan durumlarda daha iyi performans sağlayabilmesi gerekli.Sıraları temsil ettiği seq<'T> bir diğer ad türü için IEnumerable.Bu nedenle, herhangi bir.Uygulayan net Framework türü System.IEnumerable bir dizi olarak kullanılabilir.Seq modülü sıralarını ilgili uygulamaları için destek sağlar.
Sıra ifadeleri
A sıra ifade bir sıra sonucunu veren bir ifade edilir.Sıra ifadeleri çok sayıda formu alabilir.En basit şekliyle bir aralık belirler.Örneğin, seq { 1 .. 5 } , bitiş noktası 1 ve 5 de dahil olmak üzere beş öğeleri içeren bir sıra oluşturur.Ayrıca bir artış belirtin (veya azaltma) arasında çift iki nokta.Örneğin, aşağıdaki kod 10 'un katları dizisi oluşturur.
// Sequence that has an increment.
seq { 0 .. 10 .. 100 }
Sıra ifadeleri sıralı değerler üreten F# ifadeler yapılır.Kullanabileceklerini yield dizisinin bir parçası haline değerler üretmek için anahtar sözcük.
Aşağıdaki örnek gösterilebilir.
seq { for i in 1 .. 10 do yield i * i }
Kullanabileceğiniz -> operatörü yerine yield, atabilirsiniz, bu durumda do anahtar sözcüğünü aşağıdaki örnekte gösterildiği gibi.
seq { for i in 1 .. 10 -> i * i }
Aşağıdaki kod, kılavuz temsil eden bir dizi içine koordinat çifti ile birlikte bir dizin listesini oluşturur.
let (height, width) = (10, 10)
seq { for row in 0 .. width - 1 do
for col in 0 .. height - 1 do
yield (row, col, row*width + col)
}
Bir if ifadesidir bir sırada kullanılan filtre.Örneğin, yalnızca asal sayıların bir işlevi olduğunu varsayarsak, bir dizi oluşturmak için isprime türü int -> bool, sırası aşağıdaki gibi oluşturun.
seq { for n in 1 .. 100 do if isprime n then yield n }
Kullandığınızda yield veya -> bir yineleme içinde tek bir öğe sırası oluşturmak için her tekrarında beklenir.Bir dizi öğelerinin her tekrarında üretir, kullanın yield!.Bu durumda, her yineleme üzerinde oluşturulan öğeleri son sıra üretmek için birleşir.
Bir sıra ifadesinde birlikte birden çok ifadelerini de birleştirebilirsiniz.Her deyim tarafından oluşturulmuş öğeleri birbirine birleşir.Örneğin, bu konunun "Örnekleri" bölümüne bakın.
Örnekler
İlk örnek bir yineleme, filtre ve bir dizi oluşturmak için bir ödeme içeren bir sıra ifadesini kullanır.Bu kod, bir dizi asal sayı 1 ile 100 konsola yazdırır.
// Recursive isprime function.
let isprime n =
let rec check i =
i > n/2 || (n % i <> 0 && check (i + 1))
check 2
let aSequence = seq { for n in 1..100 do if isprime n then yield n }
for x in aSequence do
printfn "%d" x
Aşağıdaki kod yield dizilerini üç öğe her iki etken ve ürün oluşan oluşan çarpım tablosu oluşturmak için.
let multiplicationTable =
seq { for i in 1..9 do
for j in 1..9 do
yield (i, j, i*j) }
Aşağıdaki örnek kullanımını gösterir yield! tek tek serileri tek bir son sıra halinde birleştirmek için.Bu durumda, her alt ağaçtaki bir ikili aðaç sıralarını son sıra üretmek için yinelemeli işlevin birleşir.
// Yield the values of a binary tree in a sequence.
type Tree<'a> =
| Tree of 'a * Tree<'a> * Tree<'a>
| Leaf of 'a
// inorder : Tree<'a> -> seq<'a>
let rec inorder tree =
seq {
match tree with
| Tree(x, left, right) ->
yield! inorder left
yield x
yield! inorder right
| Leaf x -> yield x
}
let mytree = Tree(6, Tree(2, Leaf(1), Leaf(3)), Leaf(9))
let seq1 = inorder mytree
printfn "%A" seq1
Dizileri kullanma
Sıraları aynı işlevlerin çoğunu destekleyen listeler.Sıraları da gruplandırma ve anahtar oluşturma işlevlerini kullanarak sayım gibi işlemleri destekler.Sıraları sıraları ayıklanması için daha farklı işlevleri de destekler.
Uygulama geliþtiriyorsanýz sýralanabilir Koleksiyonlar oldukları için birçok veri listeleri, diziler, kümeleri ve haritalar gibi dolaylı olarak sıraları türleridir.Ortak F# veri türleri, yanında herhangi biriyle bir işlev bağımsız değişken olarak bir dizi alır çalışır.net Framework veri türü, uygulayan IEnumerable.Bu liste listeler yalnızca alabilir bir argüman olarak geçen bir işlev kontrast.Tür seq<'a> türü kısaltması olan IEnumerable<'a>.Genel uygulayan her türlü yani IEnumerable, diziler, listeleri içeren ayarlar ve F# ve çoğu da eşler.net Framework koleksiyon türleri, ile uyumlu seq yazın ve bir sıra beklenen her yerde kullanılabilir.
Modülü işlevleri
Seq modülü , Microsoft.FSharp.Collections ad sıralarıyla çalışma işlevleri içerir.Bu işlevler listeleri, diziler, haritalar ve ayarlar gibi çalışır, çünkü o türden tüm sýralanabilir bulunur ve bu nedenle sırası olarak ele alınabilir.
Sıralar oluşturma
Sıraları sıra ifadeler, daha önce açıklandığı gibi kullanarak veya belirli işlevleri kullanarak oluşturabilirsiniz.
Boş bir sıra kullanarak oluşturabileceğiniz Seq.empty, tek belirtilen öğe sırasını kullanarak oluşturabilirsiniz veya Seq.singleton.
let seqEmpty = Seq.empty
let seqOne = Seq.singleton 10
Kullanabileceğiniz Seq.init için öğeleri oluşturulur sağladığınız işlevini kullanarak bir sıra oluşturmak için.Sıra için bir boyut da sağlar.Bu işlev gibi olan List.init, sıra yineleme yapmak kadar öğeleri oluşturulmamış olmasıdır.Aşağıdaki kodu kullanımını göstermektedir Seq.init.
let seqFirst5MultiplesOf10 = Seq.init 5 (fun n -> n * 10)
Seq.iter (fun elem -> printf "%d " elem) seqFirst5MultiplesOf10
Çıkış
0 10 20 30 40
Kullanarak Seq.ofArray ve Seq.ofList<'T> İşlevi (F#), sıraları diziler ve listeleri oluşturabilirsiniz.Ancak, aynı zamanda diziler ve listeleri serileri cast işlecini kullanarak dönüştürebilirsiniz.Aşağıdaki kodda iki teknikleri gösterilir.
// Convert an array to a sequence by using a cast.
let seqFromArray1 = [| 1 .. 10 |] :> seq<int>
// Convert an array to a sequence by using Seq.ofArray.
let seqFromArray2 = [| 1 .. 10 |] |> Seq.ofArray
Kullanarak Seq.cast, tanımlanmış olanlar gibi zayıf yazılı bir koleksiyondan bir sıra oluşturmak System.Collections.Öğe türü zayıf yazılan bu tür koleksiyonlara sahip Object ve genel olmayan kullanılarak numaralandırılır IEnumerable türü.Aşağıdaki kodu kullanımını göstermektedir Seq.cast dönüştürmek için bir ArrayList bir sıra halinde.
open System
let mutable arrayList1 = new System.Collections.ArrayList(10)
for i in 1 .. 10 do arrayList1.Add(10) |> ignore
let seqCast : seq<int> = Seq.cast arrayList1
Sonsuz sıraları kullanarak tanımlayabilirsiniz Seq.initInfinite işlevi.Böyle bir sıra için her öğe öğenin dizin oluşturur bir işlev sağlar.Sonsuz sıraları nedeniyle geç değerlendirme olasıdır; öğeleri belirttiğiniz işlevini çağırarak gerektiği şekilde oluşturulur.Aşağıdaki kod örneği, devrik değeridir karelerinin ardışık tamsayıların değişen dizi kayan nokta numarası, bu durumda, sonsuz bir sıra oluşturur.
let seqInfinite = Seq.initInfinite (fun index ->
let n = float( index + 1 )
1.0 / (n * n * (if ((index + 1) % 2 = 0) then 1.0 else -1.0)))
printfn "%A" seqInfinite
SEQ.unfold bir durum alır ve sıradaki her alt öğe üretmek için dönüştüren bir hesaplama işlevi bir sıra oluşturur.Durumu her öğe hesaplamak için kullanılır ve her öğe hesaplanan gibi değiştirebilirsiniz yalnızca bir değerdir.İkinci bağımsız değişken için Seq.unfold serisi başlatmak için kullanılan başlangıç değeridir.Seq.unfolddurumu sırasını döndürerek sonlandırmak sağlayan bir seçenek türünü kullanır None değeri.Aşağıdaki kod iki sıraları, örnekleri gösterir seq1 ve fib, tarafından oluşturulan bir unfold işlem.İlk seq1, yalnızca basit bir sıra numaraları 100 kadar.İkincisi, fib, kullandığı unfold Fibonacci serisi hesaplamak için.Fibonacci dizisindeki her öğe toplamı, önceki iki Fibonacci sayı olduğundan, durumu, önceki iki sayı sırada oluşan kayıt düzeni değerdir.İlk değer (1,1), ilk iki sıra numaraları.
let seq1 = Seq.unfold (fun state -> if (state > 20) then None else Some(state, state + 1)) 0
printfn "The sequence seq1 contains numbers from 0 to 20."
for x in seq1 do printf "%d " x
let fib = Seq.unfold (fun state ->
if (snd state > 1000) then None
else Some(fst state + snd state, (snd state, fst state + snd state))) (1,1)
printfn "\nThe sequence fib contains Fibonacci numbers."
for x in fib do printf "%d " x
Çıktı aşağıdaki gibidir:
Sıra seq1 20 0 numaralarını içerir.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Fibonacci sayı dizisi fib içerir.
2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
Aşağıdaki kod üretmek ve sonsuz sıralarının değerleri hesaplamak için burada açıklanan sıra modülü işlevlerin çoğunu kullanan bir örnektir.Kod çalıştırmak için birkaç dakika sürebilir.
// infiniteSequences.fs
// generateInfiniteSequence generates sequences of floating point
// numbers. The sequences generated are computed from the fDenominator
// function, which has the type (int -> float) and computes the
// denominator of each term in the sequence from the index of that
// term. The isAlternating parameter is true if the sequence has
// alternating signs.
let generateInfiniteSequence fDenominator isAlternating =
if (isAlternating) then
Seq.initInfinite (fun index -> 1.0 /(fDenominator index) * (if (index % 2 = 0) then -1.0 else 1.0))
else
Seq.initInfinite (fun index -> 1.0 /(fDenominator index))
// The harmonic series is the series of reciprocals of whole numbers.
let harmonicSeries = generateInfiniteSequence (fun index -> float index) false
// The harmonic alternating series is like the harmonic series
// except that it has alternating signs.
let harmonicAlternatingSeries = generateInfiniteSequence (fun index -> float index) true
// This is the series of reciprocals of the odd numbers.
let oddNumberSeries = generateInfiniteSequence (fun index -> float (2 * index - 1)) true
// This is the series of recipocals of the squares.
let squaresSeries = generateInfiniteSequence (fun index -> float (index * index)) false
// This function sums a sequence, up to the specified number of terms.
let sumSeq length sequence =
Seq.unfold (fun state ->
let subtotal = snd state + Seq.nth (fst state + 1) sequence
if (fst state >= length) then None
else Some(subtotal,(fst state + 1, subtotal))) (0, 0.0)
// This function sums an infinite sequence up to a given value
// for the difference (epsilon) between subsequent terms,
// up to a maximum number of terms, whichever is reached first.
let infiniteSum infiniteSeq epsilon maxIteration =
infiniteSeq
|> sumSeq maxIteration
|> Seq.pairwise
|> Seq.takeWhile (fun elem -> abs (snd elem - fst elem) > epsilon)
|> List.ofSeq
|> List.rev
|> List.head
|> snd
// Compute the sums for three sequences that converge, and compare
// the sums to the expected theoretical values.
let result1 = infiniteSum harmonicAlternatingSeries 0.00001 100000
printfn "Result: %f ln2: %f" result1 (log 2.0)
let pi = Math.PI
let result2 = infiniteSum oddNumberSeries 0.00001 10000
printfn "Result: %f pi/4: %f" result2 (pi/4.0)
// Because this is not an alternating series, a much smaller epsilon
// value and more terms are needed to obtain an accurate result.
let result3 = infiniteSum squaresSeries 0.0000001 1000000
printfn "Result: %f pi*pi/6: %f" result3 (pi*pi/6.0)
Arama ve öğeleri bulma
Sıraları listelerle kullanılabilen işlevselliği destekler: Seq.exists, Seq.exists2, Seq.find, Seq.findIndex, Seq.pick, Seq.tryFind, ve Seq.tryFindIndex.Sıra için Aranan öğe kadar serileri için kullanılabilen bu işlevlerin sürümleri değerlendirin.Örnekler için bkz: listeler.
Sıraları elde etme
SEQ.Filter ve Seq.choose olan filtreleme ve seçim oluşmaz dışında sırası öğeleri değerlendirilir kadar listeleri için kullanılamayan ilgili işlevleri gibi.
SEQ.Truncate başka bir serisinden bir sıra oluşturur, ancak belirtilen sayıda öğe sırası ile sınırlar.SEQ.Take belirtilen sayıda bir sıra başlangıç öğelerini içeren yeni bir sıra oluşturur.Sıradaki yararlanmak için belirttiğiniz'den daha az öğe varsa Seq.take atar bir InvalidOperationException.Arasındaki fark Seq.take ve Seq.truncate olan Seq.truncate az sayı, belirttiğiniz öğelerin sayısı ise, bir hata neden olmaz.
Aşağıdaki kod davranışını gösterir ve arasındaki farklılıklar Seq.truncate ve Seq.take.
let mySeq = seq { for i in 1 .. 10 -> i*i }
let truncatedSeq = Seq.truncate 5 mySeq
let takenSeq = Seq.take 5 mySeq
let truncatedSeq2 = Seq.truncate 20 mySeq
let takenSeq2 = Seq.take 20 mySeq
let printSeq seq1 = Seq.iter (printf "%A ") seq1; printfn ""
// Up to this point, the sequences are not evaluated.
// The following code causes the sequences to be evaluated.
truncatedSeq |> printSeq
truncatedSeq2 |> printSeq
takenSeq |> printSeq
// The following line produces a run-time error (in printSeq):
takenSeq2 |> printSeq
Hata oluşmadan önce çıktı aşağıdaki gibidir.
1 4 9 16 25
1 4 9 16 25 36 49 64 81 100
1 4 9 16 25
1 4 9 16 25 36 49 64 81 100
Kullanarak Seq.takeWhile, doðrulama işlevi (Boolean işlevi) belirtin ve yüklemi olduğu özgün sıra bu öğelerden oluşan bir başka serisinden bir sıra oluşturmak true, ancak kendisi için karşılaştırma işlevi ilk öğesinden önce DUR false.SEQ.Skip başka bir sıra ilk öğelerinin belirli sayıda atlar ve geri kalan öğeleri döndürür sırası döndürür.SEQ.skipWhile yüklemi verir sürece başka bir sıra ilk öğelerinin atlar sırası döndürür true, kendisi için karşılaştırma işlevi ilk öğe ile başlayarak, geri kalan öğeleri verir ve false.
Aşağıdaki kod örneği davranışını gösterir ve arasındaki farklılıklar Seq.takeWhile, Seq.skip, ve Seq.skipWhile.
// takeWhile
let mySeqLessThan10 = Seq.takeWhile (fun elem -> elem < 10) mySeq
mySeqLessThan10 |> printSeq
// skip
let mySeqSkipFirst5 = Seq.skip 5 mySeq
mySeqSkipFirst5 |> printSeq
// skipWhile
let mySeqSkipWhileLessThan10 = Seq.skipWhile (fun elem -> elem < 10) mySeq
mySeqSkipWhileLessThan10 |> printSeq
Çıktı aşağıdaki gibidir.
1 4 9
36 49 64 81 100
16 25 36 49 64 81 100
Sıraları dönüştürme
SEQ.pairwise giriş sırasının birbirini izleyen öğeleri dizilerini gruplandırılmış yeni bir sıra oluşturur.
let printSeq seq1 = Seq.iter (printf "%A ") seq1; printfn ""
let seqPairwise = Seq.pairwise (seq { for i in 1 .. 10 -> i*i })
printSeq seqPairwise
printfn ""
let seqDelta = Seq.map (fun elem -> snd elem - fst elem) seqPairwise
printSeq seqDelta
SEQ.windowed gibi Seq.pairwise, dizilerini bir dizi oluşturmanın yerine, bir dizi bitişik öğelerinin kopyalarını içeren diziler üretir dışında (bir Pencere) serisinden.Her dizide istediğiniz bitişik öğe sayısını belirtin.
Aşağıdaki kod örneği kullanımını gösterir Seq.windowed.Bu durumda penceresinde öğelerin sayısı 3'tür.Bu örnek kullanır printSeq, önceki kod örneğinde, tanımlanır.
let seqNumbers = [ 1.0; 1.5; 2.0; 1.5; 1.0; 1.5 ] :> seq<float>
let seqWindows = Seq.windowed 3 seqNumbers
let seqMovingAverage = Seq.map Array.average seqWindows
printfn "Initial sequence: "
printSeq seqNumbers
printfn "\nWindows of length 3: "
printSeq seqWindows
printfn "\nMoving average: "
printSeq seqMovingAverage
Çıktı aşağıdaki gibidir.
Başlangıç sırası:
1.0 1.5 2.0 1.5 1.0 1.5
Windows of length 3:
[|1.0; 1.5; 2.0|] [|1.5; 2.0; 1.5|] [|2.0; 1.5; 1.0|] [|1.5; 1.0; 1.5|]
Moving average:
1.5 1.666666667 1.5 1.333333333
Birden çok serileri ile işlemleri
SEQ.zip ve Seq.zip3 iki veya üç sıraları alır ve dizilerini dizisini üretir.Bu işlevler için kullanılabilen ilgili işlevleri gibidir listeler.Bir sıra halinde iki veya daha fazla sıraları ayırmak için karşılık gelen hiçbir işlevi yoktur.Sırası için bu işleve gerek duyuyorsanız, bir liste sırası dönüştürmek ve kullanmak List.unzip.
Sıralama, karşılaştırma ve gruplandırma
Listeler için desteklenen sıralama işlevleri sıralarıyla da çalışır.Bu Seq.sort ve Seq.sortBy.Bu işlevler tam sırası ile yineleme.
İki sıraları kullanarak karşılaştırmak Seq.compareWith işlevi.İşlev sırayla birbirini izleyen öğeleri karşılaştırır ve ilk eşit olmayan çifti karşılaştığında durur.Herhangi bir ek öğeleri karşılaştırma katkıda değil.
Aşağıdaki kod kullanımını gösterir Seq.compareWith.
let sequence1 = seq { 1 .. 10 }
let sequence2 = seq { 10 .. -1 .. 1 }
// Compare two sequences element by element.
let compareSequences = Seq.compareWith (fun elem1 elem2 ->
if elem1 > elem2 then 1
elif elem1 < elem2 then -1
else 0)
let compareResult1 = compareSequences sequence1 sequence2
match compareResult1 with
| 1 -> printfn "Sequence1 is greater than sequence2."
| -1 -> printfn "Sequence1 is less than sequence2."
| 0 -> printfn "Sequence1 is equal to sequence2."
| _ -> failwith("Invalid comparison result.")
Önceki kod ilk öğe hesaplanan ve inceledi ve sonuç -1 olur.
SEQ.countBy adlı bir değer üreten bir işlev alır bir anahtar her öğe için.Bir anahtarı, her öğe üzerinde bu işlevini çağırarak her öğe için oluşturulur.Seq.countByDaha sonra anahtar değerleri ve her anahtarın değerini oluşturan öğelerin sayısı sayısı içeren bir sıra döndürür.
let mySeq1 = seq { 1.. 100 }
let printSeq seq1 = Seq.iter (printf "%A ") seq1; printfn ""
let seqResult = Seq.countBy (fun elem -> if elem % 3 = 0 then 0
elif elem % 3 = 1 then 1
else 2) mySeq1
printSeq seqResult
Çıktı aşağıdaki gibidir.
(1, 34) (2, 33) (0, 33)
1, Anahtar üretilen orijinal sıra 34 öğeleri 2 anahtarı üretilen 33 değerler ve üretilen anahtarı 0 33 değerleri olan önceki çıktıyı göstermektedir.
Çağırarak bir dizi öğeleri gruplandırabilirsiniz Seq.groupBy.Seq.groupBybir sıra ile bir öğeden bir anahtar üreten işlevi kazanır.İşlev sırası her bir öğesi olarak yürütülür.Seq.groupByBurada her kayıt düzeni ilk öğe anahtarı, ikincisinin anahtara üreten öğelerin sırasını dizilerini bir dizi döndürür.
Aşağıdaki kod örneği kullanımını göstermektedir Seq.groupBy 0, 1 ve 2 numaraları 1 ile 100 serisi farklı anahtara sahip üç gruplar halinde bölümlemek için değerleri.
let sequence = seq { 1 .. 100 }
let printSeq seq1 = Seq.iter (printf "%A ") seq1; printfn ""
let sequences3 = Seq.groupBy (fun index ->
if (index % 3 = 0) then 0
elif (index % 3 = 1) then 1
else 2) sequence
sequences3 |> printSeq
Çıktı aşağıdaki gibidir.
(1, seq [1; 4; 7; 10; ...]) (2, seq [2; 5; 8; 11; ...]) (0, seq [3; 6; 9; 12; ...])
Yinelenen öğeleri çağırarak ortadan kaldıran bir sıra oluşturduğunuz Seq.distinct.Veya Seq.distinctBy, her öğe üzerinde çağrılacak bir anahtar oluşturma işlevi gerçekleştirir.Sonuçta elde edilen sıra benzersiz anahtarlar olan öğeler özgün sırasının içerir; bir önceki öğe için yinelenen bir anahtar üretmek daha sonra öğeleri atılır.
Aşağıdaki kod örneği kullanımları gösterilmektedir Seq.distinct.Seq.distinctikili sayılar gösterir sıraları oluşturma ve sonra yalnızca farklı öğelere 0 ve 1 olduğunu gösteren gösterilmiştir.
let binary n =
let rec generateBinary n =
if (n / 2 = 0) then [n]
else (n % 2) :: generateBinary (n / 2)
generateBinary n |> List.rev |> Seq.ofList
printfn "%A" (binary 1024)
let resultSequence = Seq.distinct (binary 1024)
printfn "%A" resultSequence
Aşağıdaki kod gösterir Seq.distinctBy negatif ve pozitif bir sayı içeren bir sıra ile başlayan ve mutlak değer fonksiyonu anahtar oluşturma işlevini kullanarak.Çünkü negatif sayılar sıra ile görünür ve bu nedenle aynı mutlak değeri veya anahtarı pozitif sayılar yerine seçiliyken, negatif sayılar sıradaki karşılık gelen tüm pozitif sayılar elde edilen sıra yok.
let inputSequence = { -5 .. 10 }
let printSeq seq1 = Seq.iter (printf "%A ") seq1; printfn ""
printfn "Original sequence: "
printSeq inputSequence
printfn "\nSequence with distinct absolute values: "
let seqDistinctAbsoluteValue = Seq.distinctBy (fun elem -> abs elem) inputSequence
seqDistinctAbsoluteValue |> printSeq
Salt okunur ve önbelleğe alınan serileri
SEQ.ReadOnly bir sıra salt okunur bir kopyasını oluşturur.Seq.readonlybir dizi gibi bir okuma-yazma koleksiyonu olan ve özgün koleksiyonu değiştirmek istemiyorsanız, yararlıdır.Veri Sarma korumak için bu işlev kullanılabilir.Aşağıdaki kod örneği, bir dizi içeren bir tür oluşturulur.Bir dizi özellik sunar, ancak bir dizi döndürmek yerine, diziden kullanılarak oluşturulan bir dizisini döndürür Seq.readonly.
type ArrayContainer(start, finish) =
let internalArray = [| start .. finish |]
member this.RangeSeq = Seq.readonly internalArray
member this.RangeArray = internalArray
let newArray = new ArrayContainer(1, 10)
let rangeSeq = newArray.RangeSeq
let rangeArray = newArray.RangeArray
// These lines produce an error:
//let myArray = rangeSeq :> int array
//myArray.[0] <- 0
// The following line does not produce an error.
// It does not preserve encapsulation.
rangeArray.[0] <- 0
SEQ.Cache bir sıra saklı bir sürümünü oluşturur.Kullanmak Seq.cache bir sırası kullanan birden çok iş parçacığı vardır, ancak yalnızca bir kez her öğe sayısı, emin olmanız gerekir, bir sıra veya yeniden değerlendirme önlemek için.Birden çok iş parçacığı tarafından kullanılan sıra varsa, numaralandırır ve özgün sıra değerleri hesaplar bir iş parçacığı olabilir ve önbelleğe alınan sıra diğer iş parçacıkları kullanabilirsiniz.
Sıraları olarak hesaplamaları gerçekleştirme
Basit aritmetik işlemleri listeler, olanlar gibi gibi olan Seq.average, Seq.sum, Seq.averageBy, Seq.sumByve benzeri.
SEQ.fold, Seq.reduce, ve Seq.scan olan listeleri için kullanılamayan ilgili işlevleri gibi.Bu işlevlerin tam değişimleri destek listeleyen alt sıraları destekler.Daha fazla bilgi ve örnekler için bkz, Listeler (F#).