2009-11-17 20 views
15

F # gibi eski bir sürümü hatırlıyorum, listeler gibi sıraları eşleştirirken yapısal ayrışmaya izin veriyor. Sıra tembelliğini korurken liste sözdizimini kullanmanın bir yolu var mı? Ben böyle bir şey için umut ediyorum Seq.head ve Seq.skip 1. aramalar bir çokF # cinsinden ayrıştırılmış dizilerle eşleştirmek mümkün mü?

önlemek için umuyorum:

let decomposable (xs:seq<'a>) = 
    match xs with 
    | h :: t -> true 
    | _ -> false 
seq{ 1..100 } |> decomposable 

Ama bu sadece listelerini ele alır bir tür hatası olduğunda sunar dizileri kullanarak. List.of_seq kullanırken, sonsuz olsa bile dizideki tüm öğeleri değerlendirir gibi görünüyor.

cevap

21

PowerPack'de LazyList türünü kullanırsanız, bunun için harika olan LazyList.Nil ve LazyList.Cons adında Aktif Kalıplar vardır. Seq/IEnumerable tip, model eşleşmesi için uygun değildir; Bunun için LazyList'i tavsiye ederim. (Ayrıca bkz. Why is using a sequence so much slower than using a list in this example.)

let s = seq { 1..100 } 
let ll = LazyList.ofSeq s 
match ll with 
| LazyList.Nil -> printfn "empty" 
| LazyList.Cons(h,t) -> printfn "head: %d" h 
+5

(benim gibi) güç paketinin ne olduğunu bilmediği herkes için buraya bağlantı: http://fsharppowerpack.codeplex.com/ – gatoatigrado

7

Seq aktif desenlerde iyi çalışıyor! Burada korkunç bir şey ...

let (|SeqEmpty|SeqCons|) (xs: 'a seq) = //' 
    if Seq.isEmpty xs then SeqEmpty 
    else SeqCons(Seq.head xs, Seq.skip 1 xs) 

// Stupid example usage 
let a = [1; 2; 3] 

let f = function 
    | SeqEmpty -> 0 
    | SeqCons(x, rest) -> x 

let result = f a 

yapıyorum sürece ben StackOverflow'daki kod F # moduna vurgulayarak nasıl bilmiyorum, ben

... jenerik açıklama tuhaf gider yüzden burada OCaml kullanarak düşünüyorum
+3

Tek bir teklif vermek istediğiniz durumlar için bir numara: Başka bir tane ekle- satırın sonunda bir yorum alıntı: // ' – harms

+7

Onun sıradan bir hile, ancak birden fazla güvenilir kaynak, diziyi değerlendiren o değil iyi bir desen olduğunu belirtir O (n^2): http: // stackoverflow .com/questions/1306140/f-why-is-using-a-dizisi-çok-yavaş-yerine-a-list-in-bu-örnek/1306267 # 1306267 – Juliet

+1

Doğru, ama soru örnek özyinelemeli değil. Bu, diziyi tekrarlamak için iyi bir şey değil, ama sadece kafadaki bir desenle eşleştirmek istiyorsan ... –

0

Seq, haritanın işlevlerini de azalttığını unutmayın, böylece yalnızca bunlardan kurtulursunuz. Örnekte, işleviniz "Seq.isEmpty" ile eşdeğerdir. Fsi'yi başlatmayı deneyebilir ve sadece sekme tamamlama seçeneklerinden geçebilirsiniz ("Sırala" ifadesini girin ve sekmeyi vurun); İstediğin şeye sahip olabilir.