如何根据给定的记录类型在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" }|]
答案 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|]
关于序列而不是数组的好处是它可以根据需要创建项目,而不是一次创建。如果需要,在序列和数组之间来回移动很简单。