2013-12-14 30 views
2

我有一个元组列表,像这样: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个元素(我想要替换的元组),另一个列表包含剩余的元素。然后,我用替换元组和列表中的元组创建一个新列表...

回答

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 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 
0

我回去想了解问题并决定使用一个可变的数组。

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

由于元组是不可变的,我需要创建基于现有的一个新的记录,并在数组中覆盖它:

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

我使用的是“< - ”这是一个F#中的代码味道。我想知道是否有可比的纯功能等价物?

相关问题