2012-06-16 5 views
8

in C# und Java eine Byte-Array kann soErstellen einen Byte-Array mit dynamischer Größe in F #

byte[] b = new byte[x]; 

erstellt werden, in der x die Größe des Feldes angibt. Ich möchte in F # dasselbe machen. Ich habe gesucht, wie es geht und suchte danach in der Dokumentation. Ich denke, dass ich wahrscheinlich die falschen Suchbegriffe verwende, weil ich nicht herausfinden kann, wie.

Was ich bisher gefunden habe ist, dass Array.create kann wie folgt verwendet werden:

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

Gibt es eine andere Möglichkeit, es zu tun, die die Art und Weise mehr similiar ist, kann es in C# und Java getan werden?

Antwort

5

Ich glaube, Sie würden eine nicht initialisierte Array erstellen möchten, und füllen Sie es später:

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

Es ist die Art und Weise Sie in der Regel in C# tun/Java, die in F # unidiomatic ist. Denk darüber nach; Wenn Sie vergessen, einige Elemente zu initialisieren, müssen Sie sich mit null Albträumen befassen.

In fast allen Fällen können Sie immer das oben beschriebene Verfahren durch höherwertige Funktionen von Array module oder Array Verständnis ersetzen:

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

oder

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

Werfen Sie einen Blick auf this MSDN page; Es enthält nützliche Informationen zur Verwendung von Array in F #.

+3

Was "null" Alpträume? Sowohl Java als auch C# initialisieren implizit Elemente eines Byte-Arrays zu Bytes mit dem Wert 0. –

+2

Ich meinte die Verwendung von 'Array.zeroCreate' mit Objekten im Allgemeinen. In diesem speziellen Fall gibt es kein Problem. – pad

-1

Was meinst du?

F # hat eine Syntax unterscheidet sich von C# und Java, können Sie das Array Modul verwenden ihn mit einem Initialisierer ein Array erstellen zu lassen. Nichts ist seltsam, eine Sprache ist funktional, während die andere notwendig ist, so dass diese Unterschiede tatsächlich benötigt werden.

Nach den F # Sprache specs Sie etwas nicht erklären kann, die nicht initialisiert ist (es sei denn, mit spezifischen Mustern als Option Art, die nur Exploits sind, mit denen Sie das nicht initialisierte Konzept auszudrücken, ohne es wirklich zu haben), das ist, warum Sie müssen einen Initialisierer für Elemente im Array übergeben.

+1

„* Nach dem F # Sprache specs Sie etwas nicht erklären können, die * nicht initialisiert ist“ Eh, 'Unchecked.defaultof <>' und 'Array.zeroCreate' möchte ein Wort mit Ihnen haben .. – ildjarn

+1

Dies ist ein Vorbehalt, damit Sie eine Sprache ausnutzen können, die nicht so verwendet werden soll. 'Unchecked.defaultof ' ist ein 'null'-Wert, der für die Interoperabilität mit .NET Framework erforderlich ist. Sie sollten ihn jedoch niemals verwenden, da er in einer funktionalen Sprache nicht erforderlich sein sollte. Die Tatsache, dass es legal ist, bedeutet nicht, dass dies von der Sprachphilosophie vorgeschlagen oder entworfen wurde. – Jack

+1

Es gibt einen Unterschied zwischen "kann" und "kann nicht". – ildjarn

7

A am nächsten # analog F wäre Array.zeroCreate:

let b: byte [] = Array.zeroCreate x 

Statt impliziten Arrayelemente Initialisierung 0 Bytes auf Java und C# F # Plattformen offensichtlich den Anfangswert der Array-Elemente macht.

Was dynamic size von b in F # durch x Wert bei der Zuteilung einmal definiert und kann später nicht mehr durch Änderung x geändert werden, ähnlich wie bei C#/Java ,.

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