F# 将数组映射到上一个、当前和下一个值的元组数组中

F# 将数组映射到上一个、当前和下一个值的元组数组中,f#,F#,映射以下内容的最佳方法是什么: [|"A"; "B"; "C"; "D"|] 到 ?这是我第一次看f#所以如果不正确,请原谅我的尝试。我也没有f#所以我不能测试这个。但基于 希望它能为您指明正确的方向。我更喜欢基于惯用组合词的方法:在数组两端附加一个空字符串,用它生成三项滑动数组的序列,最后将每个序列元素映射到元组并将序列转换回数组: let conv source = Array.concat [[|String.Empty|]; source; [|String.Empty|]]

映射以下内容的最佳方法是什么:

[|"A"; "B"; "C"; "D"|]


这是我第一次看f#所以如果不正确,请原谅我的尝试。我也没有f#所以我不能测试这个。但基于


希望它能为您指明正确的方向。

我更喜欢基于惯用组合词的方法:在数组两端附加一个空字符串,用它生成三项滑动数组的序列,最后将每个序列元素映射到元组并将序列转换回数组:

let conv source =
    Array.concat [[|String.Empty|]; source; [|String.Empty|]] |> Seq.windowed 3
    |> Seq.map (fun x -> x.[0],x.[1],x.[2]) |> Seq.toArray
在FSI下测试
conv[|“A”;“B”;“C”;“D”|]
产生:

val it : (string * string * string) [] =
  [|("", "A", "B"); ("A", "B", "C"); ("B", "C", "D"); ("C", "D", "")|]
我会这样做:

let neighbors (xs: _ []) =
  let get i = if i>=0 && i<xs.Length then xs.[i] else ""
  Array.mapi (fun i x -> get(i-1), x, get(i+1)) xs
让邻居(xs:[])=
设get i=if i>=0&&i get(i-1),x,get(i+1))xs

请参见,除非您不需要复制这些值<代码>产量“”就可以了。元素的选择对我来说可能很糟糕。它们不一定是按字母顺序连续的。例如,我可能需要[|L;F;T |]->[|(,L,F);(L,F,T);(F,T,)|]
val it : (string * string * string) [] =
  [|("", "A", "B"); ("A", "B", "C"); ("B", "C", "D"); ("C", "D", "")|]
let neighbors (xs: _ []) =
  let get i = if i>=0 && i<xs.Length then xs.[i] else ""
  Array.mapi (fun i x -> get(i-1), x, get(i+1)) xs