【问题标题】:Swap key and value in a map in fsharp在 fsharp 的映射中交换键和值
【发布时间】:2015-05-15 11:40:18
【问题描述】:

如何创建一个与原始映射相似但在 Fsharp 中交换了键和值的新映射? 比如我有这个

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

想要得到这个:

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

感谢您的帮助!

【问题讨论】:

  • 你坚持的具体部分 - 显示尝试?
  • @John Palmer 有什么理由显示不起作用的代码吗?
  • 当然 - 它让我们知道如何最好地帮助您。例如 - 有一个非常明显的普通性能解决方案 - 也许这适合您的情况。也许您的解决方案只是有一个可以修复的小错误等。

标签: dictionary f# functional-programming swap


【解决方案1】:

也许你会接近这个决定:

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

【讨论】:

  • 请注意,如果您不想限制为字符串,可以输入Map&lt;'a,'b&gt;
  • @Dax Fohl,谢谢。好多了
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-04-14
    • 2018-06-28
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多