2012-06-16 38 views
8

Trong C# và Java một mảng byte có thể được tạo ra như thế nàyTạo một mảng byte với kích thước động trong F #

byte[] b = new byte[x]; 

nơi x biểu thị kích thước của mảng. Những gì tôi muốn làm là làm điều tương tự trong F #. Tôi đã tìm kiếm cách thực hiện và tìm kiếm nó trong tài liệu. Tôi nghĩ rằng tôi có thể sử dụng các cụm từ tìm kiếm sai vì tôi không thể tìm hiểu cách thực hiện.

Những gì tôi đã tìm thấy cho đến nay là Array.create thể được sử dụng như thế này:

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

Có một cách khác để làm điều đó mà là tương tự hơn với cách thức mà nó có thể được thực hiện trong C# và Java?

Trả lời

5

Tôi nghĩ rằng bạn sẽ muốn tạo một mảng chưa được khởi tạo và điền nó sau:

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

Đó là cách bạn thường làm trong C#/Java, đó là unidiomatic trong F #. Hãy suy nghĩ về nó; nếu bạn quên khởi tạo một số yếu tố, bạn phải đối phó với những cơn ác mộng null.

Trong hầu hết các trường hợp, bạn luôn có thể thay thế các thủ tục nêu trên theo chức năng high-order từ Array module hoặc mảng hiểu:

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

hoặc

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

Hãy xem this MSDN page; nó chứa thông tin hữu ích về việc sử dụng Array trong F #.

+3

Những "cơn ác mộng" null "gì?" Cả Java và C# đều ngầm khởi tạo các phần tử của một mảng byte thành các byte có giá trị 0. –

+2

Tôi có nghĩa là sử dụng 'Array.zeroCreate' với các đối tượng nói chung. Không có vấn đề với trường hợp cụ thể này. – pad

-1

Ý của bạn là gì?

F # có một cú pháp khác nhau từ C#Java, bạn đang sử dụng các mô-đun Array để cho anh ta tạo ra một mảng với một initializer. Không có gì lạ, một ngôn ngữ có chức năng trong khi ngôn ngữ kia là bắt buộc nên những khác biệt này thực sự cần thiết.

Theo F # số kỹ thuật ngôn ngữ mà bạn không thể tuyên bố một điều gì đó chưa được định hình (trừ khi sử dụng mô hình cụ thể như các loại Option mà chỉ là khai thác cho phép bạn thể hiện khái niệm chưa được định hình mà không thực sự có nó), đó là lý do tại sao bạn phải truyền một initializer cho các phần tử trong mảng.

+1

"* Theo thông số kỹ thuật F # ngôn ngữ mà bạn không thể tuyên bố một điều gì đó chưa được định hình *" Eh, 'Unchecked.defaultof <>' và 'Array.zeroCreate' muốn có một lời với bạn .. – ildjarn

+1

Đây là một thông báo trước để cho phép bạn khai thác một ngôn ngữ không được sử dụng theo cách như vậy. 'Unchecked.defaultof ' là một giá trị 'null' cần thiết cho khả năng tương tác với .NET framework, bạn không bao giờ nên sử dụng nó vì nó không cần thiết trong một ngôn ngữ chức năng. Thực tế là hợp pháp không có nghĩa là được đề xuất hoặc thiết kế bởi triết lý ngôn ngữ. – Jack

+1

Có sự khác biệt giữa "có thể" và "không thể". – ildjarn

7

Một gần nhất F # analog sẽ Array.zeroCreate:

let b: byte [] = Array.zeroCreate x 

Thay vì tiềm ẩn các yếu tố mảng khởi tạo để 0 byte trên Java và C# nền tảng F # làm cho các giá trị ban đầu của phần tử mảng rõ ràng.

Đối với dynamic size của b trong F # nó được định nghĩa một lần theo giá trị x ở việc phân bổ và không thể thay đổi sau này bằng cách thay đổi x, tương tự như C#/Java ,.

7
let b = Array.create<byte> x 0uy //Array.zeroCreate<byte> x 
Các vấn đề liên quan