Tại sao F # Core định nghĩa các kiểu mảng chung?


11

Tôi chỉ nhận thấy rằng không gian tên FSharp.Core bao gồm các kiểu mảng chung có tối đa 4 chiều, tức là Core. [] <'T> , Core. [,] <' T>, v.v. C # và VB dường như đang hoạt động tốt với System.Array - mặc dù tôi không rõ họ quản lý như thế nào để hỗ trợ các kiểu mảng chuyên dụng được gõ mạnh như int [], chuỗi [].

Tôi đoán điều này trở thành hai câu hỏi sau đó:

  • Làm thế nào để C # hỗ trợ các kiểu mảng chuyên dụng được gõ mạnh như int [] dựa trên System.Array không chung chung?
  • Cho rằng C # quản lý để làm điều này, tại sao F # định nghĩa các kiểu mảng chung?

Câu trả lời:


8

F # không định nghĩa các kiểu mảng chung cho mỗi se. Mảng trong F # là phần còn lại của loại sử dụng .NET và mặc dù tất cả các bằng chứng cú pháp chỉ ngược lại, chúng không chung chung.

Điều này đôi khi có thể gây tác dụng ngược với bạn khi bạn đang sử dụng phản chiếu trong F # - ngay cả khi bạn có một array<int>loại chung chung hoàn toàn hợp lệ, khi bạn kiểm tra nó, bạn nhận được sai từ IsGenericType, đúng IsArrayvà bạn nhận được đối số loại với GetElementTypehơn sau đó GetGenericArguments.

Giống như Telastyn đã lưu ý trong câu trả lời của mình, đây có thể là hành lý kế thừa của .NET 1.0 mà chúng ta sẽ phải sống cùng. Nhưng đó chỉ là một trong nhiều điều khiến việc sử dụng API phản chiếu trong F # trở thành một mỏ khai thác thực sự.

Những gì F # định nghĩa, là các [], [,] ...chữ viết tắt / bí danh / toán tử và mô-đun với các hàm tương ứng, nhưng cuối cùng chúng đều đề cập đến cùng một kiểu Array bên dưới.

Bạn có thể nhìn vào mã nguồn trên github tại đâyđây để tự mình xem nó.


Nhưng những điều này được liệt kê là loại thực, không phải bí danh. Tôi bối rối vì msdn.microsoft.com/en-us/l Library / dd233214.aspx nói "Loại của tất cả các mảng F # là Mảng loại .NET Framework", nhưng sau đó mối quan hệ giữa System.Array và FSharp là gì .Core mảng chung?
Asik

Không có mảng chung;) Chúng có thể là kiểu thực về mặt kỹ thuật và đó là lý do tại sao trình tạo tài liệu msd chọn chúng, nhưng tất cả những gì chúng xác định là cách trình biên dịch sẽ mở rộng chúng, nếu tôi đọc chính xác (tệp đầu tiên tôi liên kết) và một vài phương thức mở rộng trong tệp thứ hai. Thats tất cả để có nó. Tạo một trong số đó và gọi GetType trên đó. Nó sẽ là một kiểu mảng chuyên dụng dựa trên System.Array.
Scrwtp

Hay đúng hơn, bản thân các kiểu tĩnh là chung, nhưng kiểu mảng thời gian chạy mà chúng không có. Có thể thực hiện suy luận kiểu dễ hơn một chút theo cách đó, nhưng đó là một phỏng đoán hoang dã.
Scrwtp

5

Làm thế nào để C # hỗ trợ các kiểu mảng chuyên dụng được gõ mạnh như int [] dựa trên System.Array không chung chung?

Rất có thể, bằng cách tạo một lớp chuyên biệt kế thừa từ các tổng System.Arrayquát không có sẵn trong 1.0. Các hành vi có thể đã được giữ xung quanh cho tương thích.

Cho rằng C # quản lý để làm điều này, tại sao F # định nghĩa các kiểu mảng chung?

Bởi vì F # không có các ràng buộc về khả năng tương tự như C # 2.0 có với mã hiện có. Dựa trên những gì tôi biết, C # 2.0 sẽ có các kiểu mảng chung nếu đó là phiên bản đầu tiên của C #.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.