2011-03-29 9 views
5

Ok, parece que debería ser fácil, pero simplemente no lo estoy obteniendo. Si tengo una secuencia de números, ¿cómo puedo generar una nueva secuencia compuesta por los totales acumulados? por ejemplo, para una secuencia [1; 2; 3; 4], quiero asignarla a [1; 3; 6; 10]. De una manera adecuada y funcional.f # secuencia de ejecución total

Respuesta

14

Uso List.scan:

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

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

Seq.scan aplicación basada en:

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

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

Esto es genial, sin embargo, esperaba hacer esto para una secuencia en lugar de una lista. – Aidan

+0

@Aidan: editado para agregar la implementación apropiada de Seq.scan. – ildjarn

+0

Genial, ese es el indicado. Gracias. – Aidan

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

Con las listas:

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

Editar: Otra forma de secuencias:

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

Sí, hay una variable mutable, pero me resulta más fácil de leer (si desea obtener deshacerse del líder 0).

+0

genial, gracias. Sin embargo, parece generar una secuencia más grande, con un 0 inicial, no se siente como un mapa verdadero. – Aidan

0

No estoy seguro es la mejor manera pero debe hacer el truco

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

Otra variación utilizando Seq.scan (Seq.skip 1 se deshace del líder cero):

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

+1 respuesta más simple todavía. – Daniel

+2

Gracias Daniel, F # alimenta mi enfermedad para soluciones breves y elegantes. –

+1

Yo también. Temo que mi destino como programador esté entrelazado con F #. – Daniel

Cuestiones relacionadas