在fsharp中交换地图中的键和值

时间:2015-05-15 11:40:18

标签: dictionary f# functional-programming swap

如何创建一个与原始地图类似的新地图,但在Fsharp中使用交换的键和值? 例如,我有这个

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

想要得到这个:

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:7)

也许你会接受这个决定:

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

答案 1 :(得分:4)

您可以将其转换为列表并返回,调用函数在中间交换。

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

这种方法稍微强调了函数式编程的优点 - 只需组合小的构建块就可以构建复杂的行为。