F#通过取n和n-1从平面列表中创建元组列表

时间:2014-07-30 19:40:44

标签: list f# functional-programming tuples

所以基本上我有一个列表[1,2,3,4,...,n],我想创建一个新的列表(元组),然后使用List.Map将函数应用到新列表。 新列表的格式为[(NULL,1),(2,1),(3,2),(4,3),...,(n,n-1)]

但我并没有直接看到解决这个问题的最佳方法。 有什么想法吗?

由于

编辑: 通过下面的答案,我最终解决了我的问题

let TotalDistance (points:ResizeArray<TrackPoint>) = List.ofSeq(points) |> Seq.pairwise |> Seq.map(fun (x,y) -> DistanceBetween x.Position y.Position) |> Seq.sum

Trackpoint是坐标(C#)的集合,而DistanceBetween是半正式公式。

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

看看Seq.windowed它几乎可以做到你想要的东西:

[1..10] 
|> Seq.windowed 2 
|> List.ofSeq;;

val it : int [] list =
  [[|1; 2|]; [|2; 3|]; [|3; 4|]; [|4; 5|]; [|5; 6|]; [|6; 7|]; [|7; 8|];
   [|8; 9|]; [|9; 10|]]

我将忽略你的NULL(我们真的不想要这个;))并播放一下以便获得:

[1..10] 
|> Seq.windowed 2 
|> Seq.map (fun [|a;b|] -> (b,a)) 
|> List.ofSeq;;

val it : (int * int) list =
  [(2, 1); (3, 2); (4, 3); (5, 4); (6, 5); (7, 6); (8, 7); (9, 8); (10, 9)]

所以你要搜索的是:

let pairList ls = 
   ls
   |> Seq.windowed 2 
   |> Seq.map (fun [|a;b|] -> (b,a)) 
   |> List.ofSeq

将其视为让NULL进入的练习;) (确定这是卑鄙的 - 您的(Null,1)不符合序列

答案 1 :(得分:4)

这基本上是Seq.pairwise的作用。

[1..4] |> Seq.pairwise
> val it : seq<int * int> = seq [(1, 2); (2, 3); (3, 4)]

您可以通过map管道,并在必要时交换元组项。 windowed对此有点过分,因为它为列表的每个元素创建了一个数组。

如果你真的需要第一个元素出现两次,你可以将None放到列表中。

let pairs xs = 
    None::xs 
    |> Seq.pairwise
    |> Seq.toList

pairs (List.map Some [1..4])