Инициализация массива в F#

Как создать и инициализировать массив в F# на основе данного типа записи? Предположим, я хочу создать массив из 100 записей record1.

например

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

let myArray = Array.init 100 ?

но появляется массив.init не допускает этого, есть ли способ сделать это?

редактировать, чтобы добавить:

конечно, я мог бы сделать что-то вроде этого:

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

3 ответов


Это должно делать то, что вам нужно. Надеюсь, это поможет.

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

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

или с помощью дженериков

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

вы также можете использовать Array.create, который создает массив заданного размера со всеми его элементами, инициализированными до определенного значения:

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

посмотрите на этот список работа с массивами.


или вы можете создать последовательность вместо создания массива, например:

// 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|]

хорошая вещь в последовательности, а не в массиве, заключается в том, что она создает элементы по мере необходимости, а не все сразу. И это просто, чтобы вернуться и вперед между последовательностями и массивами, если вам нужно.