2011-03-29 36 views
5

Ok, điều này có vẻ như nó phải dễ dàng, nhưng tôi chỉ không nhận được nó. Nếu tôi có một chuỗi các số, làm cách nào để tạo một chuỗi mới được tạo thành từ các tổng số đang chạy? ví dụ cho một chuỗi [1; 2; 3; 4], tôi muốn ánh xạ nó tới [1; 3; 6; 10]. Trong một cách phù hợp chức năng.f # chuỗi tổng số đang chạy

Trả lời

14

Sử dụng List.scan:

let runningTotal = List.scan (+) 0 >> List.tail 

[1; 2; 3; 4] 
|> runningTotal 
|> printfn "%A" 

Seq.scan dựa trên thực hiện:

let runningTotal seq' = (Seq.head seq', Seq.skip 1 seq') ||> Seq.scan (+) 

{ 1..4 } 
|> runningTotal 
|> printfn "%A" 
+0

Điều này rất tuyệt, tuy nhiên tôi đã hy vọng làm điều này cho một chuỗi hơn là một danh sách. – Aidan

+0

@Aidan: Đã chỉnh sửa để thêm thực thi Seq.scan phù hợp. – ildjarn

+0

Tuyệt, đó là một. Cảm ơn bạn. – Aidan

5
> Seq.scan (fun acc n -> acc + n) 0 [1;2;3;4];; 
val it : seq<int> = seq [0; 1; 3; 6; ...] 

Với danh sách:

> [1;2;3;4] |> List.scan (fun acc n -> acc + n) 0 |> List.tail;; 
val it : int list = [1; 3; 6; 10] 

Edit: Một cách khác với trình tự:

let sum s = seq { 
    let x = ref 0 
    for i in s do 
     x := !x + i 
     yield !x 
} 

Vâng, có một biến có thể thay đổi, nhưng tôi thấy nó dễ đọc hơn (nếu bạn muốn nhận được thoát khỏi hàng đầu 0).

+0

tuyệt, cảm ơn. Tuy nhiên nó dường như tạo ra một chuỗi lớn hơn, với 0 ban đầu, làm nó không cảm thấy giống như một bản đồ thực sự. – Aidan

0

Không chắc đây là cách tốt nhất nhưng nó phải làm các trick

let input = [1; 2; 3; 4] 
    let runningTotal = 
    (input, 0) 
    |> Seq.unfold (fun (list, total) -> 
     match list with 
     | [] -> 
     None 
     | h::t -> 
     let total = total + h 
     total, (t, total) |> Some) 
    |> List.ofSeq 
13

biến thể khác sử dụng Seq.scan (Seq.skip 1 loại bỏ hàng đầu số không):

> {1..4} |> Seq.scan (+) 0 |> Seq.skip 1;; 
val it : seq<int> = seq [1; 3; 6; 10] 
+0

+1 Câu trả lời đơn giản nhất. – Daniel

+2

Cảm ơn Daniel, F # cho bệnh tật của tôi cho các giải pháp gọn gàng, thanh lịch. –

+1

Tôi cũng thế. Tôi sợ số phận của tôi như là một lập trình viên được gắn bó với F #. – Daniel

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