如何创建一个类似于原始地图的新地图,但在Fsharp中有交换的键和值? 例如,我有这样的在fsharp的地图中交换密钥和值
let map1 =
[("A", "1"); ("B", "2"); ("C", "3");]
|> Map.ofList
,并希望得到这样的:
let map2 =
[("1", "A"); ("2", "B"); ("3", "C");]
|> Map.ofList
谢谢您的帮助!
如何创建一个类似于原始地图的新地图,但在Fsharp中有交换的键和值? 例如,我有这样的在fsharp的地图中交换密钥和值
let map1 =
[("A", "1"); ("B", "2"); ("C", "3");]
|> Map.ofList
,并希望得到这样的:
let map2 =
[("1", "A"); ("2", "B"); ("3", "C");]
|> Map.ofList
谢谢您的帮助!
也许你会接近这个决定:
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")]
注意,如果你不想限制为字符串,你可以输入'Map <'a,'b>'。 –
@Dax Fohl,谢谢。好多了 –
你可以将其转换为一个列表和背部,调用一个函数在交换中间。
let swap (x, y) = y, x
let swapAll tuples = List.map swap tuples
let invert map = map |> Map.toList |> swapAll |> Map.ofList
这种方法有点突出了功能编程的好处 - 您可以通过组合小型构建块来建立复杂的行为。
你坚持什么特定的部分 - 显示一个尝试? –
@John Palmer是否有任何理由显示不起作用的代码? – user3608127
当然 - 它让我们了解如何最好地帮助你。例如 - 普通性能有一个非常明显的解决方案 - 也许这对您的情况是可以的。也许你的解决方案只是有一个小错误,可以修复等。 –