2015-05-15 56 views
3

如何创建一个类似于原始地图的新地图,但在Fsharp中有交换的键和值? 例如,我有这样的在fsharp的地图中交换密钥和值

let map1 = 
[("A", "1"); ("B", "2"); ("C", "3");] 
|> Map.ofList 

,并希望得到这样的:

let map2 = 
[("1", "A"); ("2", "B"); ("3", "C");] 
|> Map.ofList 

谢谢您的帮助!

+0

你坚持什么特定的部分 - 显示一个尝试? –

+0

@John Palmer是否有任何理由显示不起作用的代码? – user3608127

+1

当然 - 它让我们了解如何最好地帮助你。例如 - 普通性能有一个非常明显的解决方案 - 也许这对您的情况是可以的。也许你的解决方案只是有一个小错误,可以修复等。 –

回答

6

也许你会接近这个决定:

let map1 = Map.ofList [("A", "1"); ("B", "2"); ("C", "3")] 

map1 |> printfn "%A" 

let rev map: Map<string,string> = 
     Map.fold (fun m key value -> m.Add(value,key)) Map.empty map 

rev map1 |> printfn "%A" 

打印:

map [("A", "1"); ("B", "2"); ("C", "3")] 
map [("1", "A"); ("2", "B"); ("3", "C")] 

链接:http://ideone.com/cfN2yH

+3

注意,如果你不想限制为字符串,你可以输入'Map <'a,'b>'。 –

+0

@Dax Fohl,谢谢。好多了 –

3

你可以将其转换为一个列表和背部,调用一个函数在交换中间。

let swap (x, y) = y, x 
let swapAll tuples = List.map swap tuples 
let invert map = map |> Map.toList |> swapAll |> Map.ofList 

这种方法有点突出了功能编程的好处 - 您可以通过组合小型构建块来建立复杂的行为。