2010-08-31 2 views
1

У меня простая проблема, и поскольку я новичок F #, я не могу понять, как это сделать. У меня есть список кортежей:Начальное состояние в F # List.scan

let l = [ (a, 2); (b, 3); (c, 2); (d, 6) ] 

, что я хочу, чтобы превратиться в это:

let r = [ (a, 2); (b, 5); (c, 7); (d, 13) ] 

Это просто добавляет значения второго элемента в каждом наборе: 2 + 3 + 2 + 6. Объекты a, b, c и d являются сложными объектами, которые я просто хочу сохранить.

Я думал, что должен использовать List.scan. Она принимает список, нить аккумулятора через вычисление и возвращает список:

let r = l |> List.scan (fun (_, s) (o, i) -> (o, s + i)) (??, 0) |> List.tail 

Но я не знаю, что заполнить для знаков вопроса. Меня не интересует начальное состояние, за исключением 0. И я не хочу указывать некоторый «пустой» экземпляр первого элемента кортежа.

Или есть более простой способ сделать это?

ответ

8

Вы можете использовать первый элемент в исходном состоянии:

let l = [ ("a", 2); ("b", 3); ("c", 2); ("d", 6) ] 

let x::xs = l 
let res = (x, xs) ||> List.scan (fun (_, x) (o, n) -> o, x + n) // [("a", 2); ("b", 5); ("c", 7); ("d", 13)] 

Особый случай с пустым списком должен быть обработан отдельно

+0

Это вид простого решения я искал. Благодарю. Я раньше не сталкивался с оператором ||>, но я полагаю, он просто передает два операнда в выражение? –

+0

Да, это оператор двойного конвейера, определенный как: let (||>) (a, b) f = f a b – desco

Смежные вопросы