F#:使用键展开表单(字符串*字符串列表)列表的元组列表

时间:2014-08-23 18:33:01

标签: list f# tuples

前几天我问过如何通过将其中一个元素分组到数组(F#: Reduce a list of tuples by grouping one of the elements into arrays)来减少元组列表。我现在想学习如何做到与此相反。让我说我有这个:

  

(" A",[" B";" C&#34 ;;" D&#34 ;;" E"] )

我希望得到这个:

  

[(" A"," B"); (" A"," C"); (" A"," D"); (" A"," E")]

这样做的功能方法是什么?我怎么能用附加的这种类型的元素列表呢?我试过了:

  

让prb =(" A",[" B";" C&#34 ;;" D&#34 ;;" E&# 34;])|> [对于我在snd - > (fst,i)]

但还没有奏效。

非常感谢您的回答!我是F#的新手,如果这是非常基本的话,我很抱歉

2 个答案:

答案 0 :(得分:3)

您可以在List.map上使用snd source

let source = ("A", ["B"; "C"; "D"; "E"]);;

// val source : string * string list = ("A", ["B"; "C"; "D"; "E"])

let result = snd source |> List.map (fun x -> fst source, x);;

// val result : (string * string) list =
//    [("A", "B"); ("A", "C"); ("A", "D"); ("A", "E")]

<强>更新

有关这些元素的列表

let source = [("A", ["B"; "C"; "D"; "E"]);("A", ["B"; "C"; "D"; "E"]);("A", ["B"; "C"; "D"; "E"])];;

// val source : (string * string list) list =
//   [("A", ["B"; "C"; "D"; "E"]); ("A", ["B"; "C"; "D"; "E"]);
//    ("A", ["B"; "C"; "D"; "E"])]

你可以使用上面的代码声明一个函数

let collectTuple (x, items) = items |> List.map (fun y -> x, y);;

// val collectTuple : x:'a * items:'b list -> ('a * 'b) list

并使用它来调用List.map

let result = source |> List.map collectTuple;;

// val result : (string * string) list list =
//   [[("A", "B"); ("A", "C"); ("A", "D"); ("A", "E")];
//    [("A", "B"); ("A", "C"); ("A", "D"); ("A", "E")];
//    [("A", "B"); ("A", "C"); ("A", "D"); ("A", "E")]]

List.collect如果您只需要一个元组列表:

let result = source |> List.collect collectTuple;;

// val result : (string * string) list =
//   [("A", "B"); ("A", "C"); ("A", "D"); ("A", "E"); ("A", "B"); ("A", "C");
//    ("A", "D"); ("A", "E"); ("A", "B"); ("A", "C"); ("A", "D"); ("A", "E")]

答案 1 :(得分:0)

作为使用List.map的替代方法,您还可以使用列表推导。对于简单的转换,这通常是我的首选,但这只是风格问题,所以Marcin的答案非常好。

完成的版本如下所示:

let collectTuple (key, values) = 
  [ for v in values -> key, v ]

在您尝试的解决方案中,您尝试使用fstsnd来访问元组的元素,这也是有效的:

let collectTuple input = 
  [ for v in snd input -> fst input, v ]