我有一个像这样的数组:
let array = [|"A";"B";"C";"D"|]
我想基于原始数组的值和索引创建一个数组:
[|"A",0;"B",1;"C",2;"D",4|]
如果有办法在不诉诸循环的情况下做到这一点?我在想Seq.mapi或Seq.fold,但我对他们没有太大的成功......
提前致谢。
答案 0 :(得分:1)
功能Array.mapi和Array.collect可以解决问题:
array |> Array.mapi (fun i e -> (i, e)) |> Array.collect (fun (a, b) -> [|string a;b|])
对该表达式的评估产生:
val it : string [] = [|"0"; "A"; "1"; "B"; "2"; "C"; "3"; "D"|]
但是,我已将整数转换为字符串。否则编译器无法推断数组的类型。
如果您需要包含不同类型元素的数组,可以使用Discriminated Union类型。 这是一个例子:
type ArrayElement =
| Int of int
| String of string
[|"A";"B";"C";"D"|] |> Array.mapi (fun i e -> (i, e)) |> Array.collect (fun (a, b) -> [|Int(a);String(b)|])
答案 1 :(得分:1)
正如Valera所说,答案在于Array.mapi。
但是我注意到你想要的输出不是Valera建议的不同类型(字符串和整数)的数组,而是一个字符串* int的元组数组。
鉴于此,答案更简单:
let array = [|"A";"B";"C";"D"|]
array
|> Array.mapi (fun i s -> s, i)
(顺便说一下,我认为你的最后一个指数应该是3而不是4。)