Pregunta sobre initialization, f#, arrays – Inicialización de matriz en F #

6

¿Cómo creo e inicializo una matriz en F # en función de un tipo de registro dado? Supongamos que quiero crear una matriz de 100 registros1 registros.

p.ej.

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

let myArray = Array.init 100 ?

Pero parece que el Array.init no permite esto, ¿hay alguna manera de hacerlo?

Editado para añadir:

Por supuesto que podría hacer algo como esto:

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

Tu respuesta

3   la respuesta
11

Esto debería hacer lo que necesitas. Espero eso ayude.

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

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

o usando genéricos

let myArray  = Array.init<record1> 100 (fun x -> {value1 = "x"; value2 = "y"})
Esto no es tan eficiente como la respuesta usandoArray.create, que solo tiene que crear un único objeto de registro en lugar de crear 100 objetos separados. Dado que los registros F # son inmutables, no hay inconvenientes ya que el valor de ese objeto nunca cambiará. (Ver mi comentario en elArray.create contesta para mas detalles.) rmunn
11

Puedes usar tambiénArray.create, que crea una matriz de un tamaño dado, con todos sus elementos inicializados a un valor definido:

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

Dale un vistazo a esta lista deoperaciones de matriz.

¿Estas seguro acerca de esto? Para mí, esto creó una matriz de 100 artículos, todos apuntando al mismo registro. Entonces, si digo myArray. [5] .value1 <- 100, entonces myArray. [10] .value1 también devolverá 100 porque solo había un registro real (sospecho). Cuando usé Array.init 100 (fun x-> {value1 = "x"; value2 = "y"}) funcionó como se esperaba. gjvdkamp
@gjvdkamp - Excepto que, dado que los registros de F # son inmutables de forma predeterminada, no hay absolutamente ningún problema con una matriz de 100 elementos que apuntan al mismo registro, a menos que haya creado un registro con campos mutables. (Lo que suele ser una mala idea, por muchas razones para entrar en un solo comentario). Si su registro es inmutable, el compilador no le permitirá hacerlo.myArray.[5].value1 <- 100; en cambio, estarías haciendomyArray.[5].value1 = { myArray.[5] with value1 = 100 }, lo que crea unnuevo objeto y lo asigna a esa posición de matriz. Verfsharpforfunandprofit.com/posts/records para más. rmunn
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|]

Lo bueno de la secuencia, en lugar de una matriz, es que crea elementos a medida que los necesita, en lugar de todos a la vez. Y es simple ir y venir entre secuencias y matrices si es necesario.

Preguntas relacionadas