2009-11-17 28 views
15

Tôi dường như nhớ phiên bản cũ hơn của F # cho phép phân hủy cấu trúc khi kết hợp chuỗi giống như danh sách. Có cách nào để sử dụng cú pháp danh sách trong khi vẫn giữ trình tự lười biếng không? Tôi hy vọng sẽ tránh được rất nhiều cuộc gọi đến Seq.head và Seq.skip 1.Có thể kết hợp với các chuỗi bị phân tách trong F # không?

Tôi hy vọng cho một cái gì đó như:

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

Nhưng điều này chỉ xử lý danh sách và đưa ra một lỗi khi loại sử dụng trình tự. Khi sử dụng List.of_seq, có vẻ như để đánh giá tất cả các phần tử trong chuỗi, ngay cả khi nó là vô hạn.

Trả lời

21

Nếu bạn sử dụng loại LazyList trong PowerPack, nó có các mẫu hoạt động được gọi là LazyList.Nil và LazyList.Cons là điều tuyệt vời cho việc này.

Loại seq/IEnumerable không phải là đặc tính phù hợp với mẫu phù hợp; Tôi rất muốn giới thiệu LazyList cho việc này. (Xem thêm 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

liên kết ở đây cho bất kỳ ai (như tôi) không biết gói nguồn là gì: http://fsharppowerpack.codeplex.com/ – gatoatigrado

7

Seq hoạt động tốt trong các mẫu đang hoạt động! Trừ khi tôi đang làm một cái gì đó khủng khiếp ở đây ...

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 

Tôi không biết làm thế nào để nhận được mã StackOverflow của nhấn mạnh vào F # chế độ, tôi nghĩ đó là sử dụng OCaml ở đây để chú thích chung đi lập dị ...

+3

Một thủ thuật cho các trường hợp bạn muốn có một dấu nháy đơn: Thêm một đơn vị khác- trích dẫn trong một nhận xét ở cuối dòng: // ' – harms

+7

Thủ thuật gọn gàng của nó, nhưng nhiều hơn một nguồn đáng tin cậy chỉ ra rằng nó không phải là một mô hình tốt vì việc đánh giá trình tự là O (n^2): http: // stackoverflow .com/questions/1306140/f-why-is-using-a-chuỗi-so-nhiều-chậm-hơn-sử dụng-danh sách-trong-ví dụ này/1306267 # 1306267 – Juliet

+1

Đúng, nhưng ví dụ của người hỏi là không đệ quy. Điều này rõ ràng là không tốt cho việc đệ quy lại trình tự, nhưng nếu bạn chỉ muốn mô hình phù hợp trên đầu hoặc một cái gì đó ... –

0

Hãy nhớ rằng seq cũng có chức năng giảm bản đồ, vì vậy, bạn thường có thể chỉ có được những chức năng này. Trong ví dụ, hàm của bạn tương đương với "Seq.isEmpty". Bạn có thể thử khởi động fsi và chỉ chạy qua các tùy chọn hoàn thành tab (nhập "Seq." Và nhấn tab rất nhiều); nó có thể có những gì bạn muốn.

Các vấn đề liên quan