2009-07-12 20 views
6

Belirli bir kayıt türüne göre F # içindeki bir diziyi nasıl oluşturabilir ve başlatabilirim? 100 kayıt1 kayıtlarından oluşan bir Dizi oluşturmak istediğimi varsayalım.Dizi başlatma F #

örn.

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

let myArray = Array.init 100 ? 

Ama buna izin vermez Array.init görünür bunu yapmanın bir yolu var mı?

Düzenlendi eklemek için: Elbette

böyle bir şey yapabileceğini:

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

cevap

11

Bu neye ihtiyacınız yapmalıdır. Umarım yardımcı olur.

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

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

kullanarak veya Jenerik

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

Bu, 100 ayrı nesne oluşturmak yerine yalnızca tek bir kayıt nesnesi oluşturmak zorunda olan 'Array.create' kullanılarak yanıt kadar etkili değildir. F # kayıtları değişmez olduğu için, bu nesnenin değeri asla değişmeyeceği için herhangi bir dezavantaj yoktur. (Daha fazla bilgi için 'Array.create' cevabı üzerine yorumuma bakın.) – rmunn

11

Ayrıca, belli bir değere başlatıldı tüm elemanları ile, verilen bir boyuttaki bir dizi oluşturur Array.create, kullanabilir:

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

verin Bu liste array operations'a bir bakış.

+3

Bundan emin misiniz? Benim için bu, hepsi aynı kaydı gösteren 100 öğeden oluşan bir dizi oluşturdu. Yani eğer benimArray'ım dediysem [5] .value1 <- 100, o zaman benimArray'ım [10] .value1 de 100'e dönecekti, çünkü sadece bir gerçek kayıt vardı (şüpheliyim). Array.init 100 kullanıldığında (fun x-> {value1 = "x"; value2 = "y"}) beklendiği gibi çalıştı. – gjvdkamp

+1

@gjvdkamp - F # kayıtlarının varsayılan olarak değiştirilememesinden öte, değişebilir alanlarla bir kayıt oluşturmadığınız sürece, hepsi aynı kayda işaret eden 100 öğeden oluşan bir dizi ile ilgili hiçbir sorun yoktur. (Tek bir yoruma girebilmek için çok fazla sebepten dolayı genellikle kötü bir fikirdir). Kaydınız değişmezse, derleyici 'myArray. '[5] .value1 <- 100' yapmanıza izin vermez; yerine, myArray [5] .value1 = {myArray. [5] value1 = 100} 'ile, * yeni bir nesne * oluşturur ve bu dizi konumuna atar. Daha fazlası için https://fsharpforfunandprofit.com/posts/records/ adresini ziyaret edin. – rmunn

2

Yoksa böyle yerine bir dizi oluşturmak yerine, bir dizi oluşturabilirsiniz:

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

güzel bir şey dizisi hakkında, bir dizi yerine, olan onlara ihtiyaç gibi öğeleri oluşturur, daha doğrusu her şeyden önce. Gerekirse diziler ve diziler arasında gidip gelmek çok basit.