F# - 根据输入数组的值和索引创建元组数组

时间:2013-12-26 02:06:17

标签: f#

我有一个像这样的数组:

let array = [|"A";"B";"C";"D"|]

我想基于原始数组的值和索引创建一个数组:

[|"A",0;"B",1;"C",2;"D",4|]

如果有办法在不诉诸循环的情况下做到这一点?我在想Seq.mapi或Seq.fold,但我对他们没有太大的成功......

提前致谢。

2 个答案:

答案 0 :(得分:1)

功能Array.mapiArray.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。)