Bu senaryoda yaklaşımınızın iyi olduğunu düşünüyorum. Orada tekrarını uygulamak için yerleşik bir işlevdir, ancak genellikle dizileri tekrarlamak gerekirse, bir kendini tanımlayabilir ve Seq
modülünde o kullanılabilir yapabilirsiniz: sanki
module Seq =
let repeat items =
seq { while true do yield! items }
Sonra güzelce Seq.repeat [ 1 .. 4 ]
yazabilir F # IntelliSense her iki işlevi Seq
modülünden ve Seq
modülünden tek bir modülde tanımlanmış gibi gösterdiğinden, repeat
standart bir F # kitaplığı işleviydi.
Uygulamanızın yanı sıra, dizi oluştururken başka bir oldukça yaygın model olan yinelemeli sıra ifadesini de kullanabilirsiniz. while
kullanma fonksiyonel özyineleme karşılaştırıldığında (basit tekrarlar için herhangi bir devlete ihtiyacımız yok rağmen) zorunludur bazı bakımlardan şudur: oluşturulurken bazı devlet tutmak istediğinizde
let rec repeat items =
seq { yield! items
yield! repeat items }
Bu yaklaşım daha iyidir. Örneğin, while
kullanarak tüm sayıları 1 ..
oluşturmak çok hoş olmaz, çünkü değiştirilebilen duruma ihtiyacınız vardır. Özyinelemeyi kullanarak, aynı şeyi yazabilirsiniz olarak:
let rec numbersFrom n =
seq { yield n
yield! numbersFrom (n + 1) }
Bir yakaladım burada: Seq.initInfinite sadece belirli sonsuzluk değerleri için sonsuz diziler üretir. [Belgeler] 'den (http://msdn.microsoft.com/en-us/library/ee370429.aspx): "İterasyon Int32.MaxValue'ye kadar devam edebilir." –
Çekirdek lib'in sınırsız tanımına uyuyor, bu da kullanılabilir bir çalışma tanımı. – Daniel