Инициализация массива в F # - PullRequest
6 голосов
/ 12 июля 2009

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

, например

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 ]

11 голосов
/ 12 июля 2009

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

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

Посмотрите на этот список операций с массивами .

11 голосов
/ 12 июля 2009

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

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"})
2 голосов
/ 26 ноября 2009

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

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

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

...