所以基本上我有一个列表[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是半正式公式。
感谢您的帮助!
答案 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])