Инициализация массива в 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|]
хорошая вещь в последовательности, а не в массиве, заключается в том, что она создает элементы по мере необходимости, а не все сразу. И это просто, чтобы вернуться и вперед между последовательностями и массивами, если вам нужно.