F#中的数组初始化

时间:2009-07-12 04:00:14

标签: arrays f# initialization

如何根据给定的记录类型在F#中创建和初始化数组? 假设我想创建一个包含100条记录1的数组。

e.g。

type record1 = {
  value1:string;
  value2:string
}

let myArray = Array.init 100 ?

但似乎Array.init不允许这样做,有没有办法做到这一点?

编辑添加:

当然我可以这样做:

let myArray = [|for i in 0..99 -> { value1="x"; value2="y" }|]

3 个答案:

答案 0 :(得分:11)

这应该做你需要的。希望它有所帮助。

type record1 = {
  value1:string;
  value2:string
}

let myArray  = Array.init 100 (fun x -> {value1 = "x"; value2 = "y"})

或使用Generics

let myArray  = Array.init<record1> 100 (fun x -> {value1 = "x"; value2 = "y"})

答案 1 :(得分:11)

您也可以使用Array.create,它创建一个给定大小的数组,并将其所有元素初始化为定义的值:

let myArray  = Array.create 100 {value1="x"; value2="y"}

查看此array operations列表。

答案 2 :(得分:2)

或者您可以创建一个序列,而不是创建一个数组,如下所示:

// nItems, given n and an item, returns a sequence of item repeated n times
let rec nItems n item = 
  seq {
    match n with
    | n when n > 0 -> yield item; yield! nItems (n - 1) item
    | _ -> ()
  }

type Fnord =
 { foo: int }

printfn "%A" (nItems 99999999 {foo = 3})
// seq [{foo = 3;}; {foo = 3;}; {foo = 3;}; {foo = 3;}; ...]

printfn "%A" (nItems 3 3 |> Seq.toArray)
[|3; 3; 3|]

关于序列而不是数组的好处是它可以根据需要创建项目,而不是一次创建。如果需要,在序列和数组之间来回移动很简单。