在F#中交换Map中的键和值

4
如何在F#中创建一个类似于原始地图但是键和值交换的新地图? 例如,我有这个:
let map1 =
[("A", "1"); ("B", "2"); ("C", "3");]
|> Map.ofList

并且希望得到这个:

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

感谢您的帮助!

你卡在哪个具体的部分了 - 能展示一下你的尝试吗? - John Palmer
@John Palmer 有没有必要展示不起作用的代码? - user3608127
1
当然 - 它给了我们一个关于如何最好地帮助您的想法。例如,有一个普通性能的相当明显的解决方案 - 或许那对于您的情况来说就足够了。或许您的解决方案只是有一个微小的错误可以修复等。 - John Palmer
2个回答

9
也许您正在考虑这个决定:
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")]

Link: http://ideone.com/cfN2yH


3
请注意,如果您不想限制为字符串,则可以将其类型设置为“Map<'a,'b>”。 - Dax Fohl
@Dax Fohl,谢谢。好多了。 - FoggyFinder

6
你可以将其转换为列表并再次转换回来,调用函数在中间进行交换。
let swap (x, y) = y, x
let swapAll tuples = List.map swap tuples
let invert map = map |> Map.toList |> swapAll |> Map.ofList

这种方法在某种程度上突显了函数式编程的优点——通过组合小的构建块,您可以构建复杂的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接