F#:更新元组列表中的单个元组

时间:2013-12-14 15:32:06

标签: f#

我有一个像这样的元组列表:

let scorecard = [ for i in 0 .. 39 -> i,0 ]

我想识别其中的第n个元组。我是这样想的:

let foundTuple = scorecard |> Seq.find(fun (x,y) -> x = 10)

然后我想根据找到的元组创建一个新元组:

let newTuple = (fst foundTuple, snd foundTuple + 1)

并拥有一个包含更新值的新列表

有没有人有一些符合这种模式的代码?我想我必须将列表拆分为2个子列表:1个列表有1个元素(我要替换的元组),另一个列表有剩余的元素。然后我创建一个新的列表,其中包含替换元组和未更改的元组列表......

2 个答案:

答案 0 :(得分:6)

您可以使用List.mapi使用指定的投影函数创建新列表 - 但它也会使用当前索引调用投影函数,因此您可以根据此索引决定要执行的操作。

例如,要增加整数列表的第二个元素,您可以执行以下操作:

let oldList = [0;0;0;0]
let newList = oldList |> List.mapi (fun index v -> if index = 1 then v + 1 else v)

根据问题,使用Map类型而不是列表可能是有意义的 - map表示从键到值的映射,并且在更改单个值时不需要复制整个内容。所以,例如:

// Map keys from 0 to 3 to values 0
let m = Map.ofList [0,0;1,0;2,0;3,0]
// Set the value at index 1 to 10 and get a new map
Map.add 1 10 m

答案 1 :(得分:0)

我回去思考这个问题并决定使用一个可变的数组。

let scorecard = [| for i in 0 .. 39 -> i,0 |]

由于元组不可变,我需要根据现有元组创建一个新元组并在数组中覆盖它:

let targetTuple = scorecard.[3]
let newTuple = (fst targetTuple, snd targetTuple + 1)
scorecard.[3] <- newTuple

我正在使用“&lt; - ”这是F#中的代码气味。我想知道是否有类似的纯功能等价物?

相关问题