F C#

2012-06-16 20 views
8

# ve Java dinamik boyutta bir bayt dizisi oluşturma bir bayt dizisi x dizinin boyutunu gösterir buF C#

byte[] b = new byte[x]; 

gibi oluşturulabilir. Yapmak istediğim şey aynı şeyi F # yapmak. Nasıl yapılacağını araştırdım ve belgelere baktım. Sanırım yanlış arama terimlerini kullanıyorum çünkü nasıl olduğunu anlayamıyorum. Ben şimdiye kadar bulduğum ne

Array.create böyle kullanılabileceğini şudur: C# ve Java yapılabilir şekilde daha benzer olan bunu yapmanın başka bir yolu

let b = Array.create x (new Byte()) 

var mı?

cevap

5

senin bir başlatılmamış dizi oluşturmak ve daha sonra doldurmak istiyorum düşünüyorum:

let arr = Array.zeroCreate 10 
for i in 0..9 do 
    arr.[i] <- byte(i*i) 

Bu normalde F # unidiomatic olan C#/Java, yapmak yoludur. Bunu düşün; Bazı öğeleri başlatmayı unutursanız, null nightmares ile uğraşmak zorundasınız. Neredeyse her durumda

, her zaman Array module veya dizi anlama gelen yüksek mertebeden fonksiyonlar ile yukarıdaki prosedürü değiştirebilirsiniz:

let arr = Array.init 10 (fun i -> byte(i*i)) 

veya

let arr = [| for i in 0..9 do -> byte(i*i)|] 

this MSDN page bir göz atın; F # içindeki Array kullanımı hakkında yararlı bilgiler içerir.Eh "Eğer * başlatılmamış olması bir şeyi beyan edemez F # dili özellikleri göre *"

+3

Ne "null" kabuslar? Hem Java hem de C#, bir bayt dizisinin öğelerini 0. değeriyle bayt olarak örtük olarak başlatır. –

+2

Genelde nesnelerle "Array.zeroCreate" kullanımı kastediyorum. Bu özel durum ile ilgili bir sorun yoktur. – pad

-1

Ne demek istiyorsun?

F #, ona bir ilklendiricili bir dizi oluşturmak izin Array modülünü kullanan JavaC# ve farklı bir sözdizimi vardır. Garip bir şey, bir dil işlevsel iken diğeri zorunludur, dolayısıyla bu farklılıklar gerçekten gereklidir.

Eğer başlatılmamış olan bir şeyi beyan edemez F # dil özellikleri göre, işte bu yüzden (eğer gerçekten kalmadan başlatılmamış kavramını ifade etmek için izin sadece patlatır vardır Option türü gibi belirli kalıpları kullanarak sürece) dizideki öğeler için bir başlatıcıyı geçmek zorundasınız.

+1

, 'Unchecked.defaultof <>' ve 'Array.zeroCreate' seninle konuşmak istiyorum .. – ildjarn

+1

Bu, bir şekilde kullanılması amaçlanmamış bir dili kullanmanıza izin veren bir uyarıdır. 'Unchecked.defaultof ', .NET framework ile birlikte çalışabilirlik için gerekli bir "null" değeridir, işlevsel bir dilde gereksiz olması gerektiğinden, onu asla kullanmamalısınız. Yasal olan, dil felsefesi tarafından önerildiği veya tasarlandığı anlamına gelmez. – Jack

+1

"Can" ve "can't" arasında bir fark var. – ildjarn

7

bir yakın F # analog

let b: byte [] = Array.zeroCreate x 

yerine kapalı dizi elemanları başlatma Java ve C# platformları F # ile ilgili 0 bayt Array.zeroCreate: belirgin dizi elemanlarının başlangıç ​​değeri yapar olacaktır. F # b arasında dynamic size için bu ayırma de x değeri ile bir kez tanımlanır ve benzer şekilde, C#/Java için, x değiştirerek, daha sonra değiştirilemez olarak

,.

7
let b = Array.create<byte> x 0uy //Array.zeroCreate<byte> x