Начальное состояние в F # List.scan - PullRequest
2 голосов
/ 31 августа 2010

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

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.И я не хочу указывать какой-то «пустой» экземпляр первого элемента кортежа.

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

1 Ответ

9 голосов
/ 31 августа 2010

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

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)]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...