Mengapa F # Core menentukan tipe array generik?

11

Saya baru saja memperhatikan bahwa namespace FSharp.Core termasuk tipe array generik hingga 4 dimensi, yaitu Core. [] <'T> , Core. [,] <' T>, dll. C # dan VB tampaknya baik-baik saja. dengan System.Array - meskipun tidak jelas bagi saya bagaimana mereka mengelola untuk mendukung tipe array khusus yang diketik dengan kuat seperti int [], string [].

Saya kira ini menjadi dua pertanyaan kemudian:

  • Bagaimana C # mendukung tipe array khusus yang sangat diketik seperti int [] berdasarkan System.Array non-generik?
  • Mengingat bahwa C # berhasil melakukan ini, mengapa F # mendefinisikan tipe array generik?
Asik
sumber

Jawaban:

8

F # tidak mendefinisikan tipe array generik per se. Array dalam F # adalah jenis array yang sama dari penggunaan .NET, dan meskipun semua bukti sintaksis menunjukkan sebaliknya, mereka tidak generik.

Ini kadang-kadang bisa menjadi bumerang bagi Anda ketika Anda menggunakan refleksi di F # - bahkan jika Anda memiliki array<int>yang tampaknya menjadi tipe generik yang benar-benar valid, ketika Anda memeriksanya Anda mendapatkan false dari IsGenericType, true from IsArray, dan Anda mendapatkan argumen type dengan GetElementTypelebih dari itu GetGenericArguments.

Seperti yang dicatat Telastyn dalam jawabannya, ini kemungkinan adalah bagasi warisan .NET 1.0 yang harus kita pakai. Tapi itu hanya salah satu dari banyak hal yang membuat menggunakan API refleksi di F # ladang ranjau nyata.

Apa yang didefinisikan oleh F #, adalah [], [,] ...singkatan jenis / alias / operator dan modul dengan fungsi yang sesuai, tetapi semuanya pada akhirnya merujuk ke jenis Array yang sama di bawahnya.

Anda dapat melihat kode sumber di github di sini dan di sini untuk melihatnya sendiri.

scrwtp
sumber
Tapi ini terdaftar sebagai tipe nyata, bukan tipe alias. Saya bingung karena msdn.microsoft.com/en-us/library/dd233214.aspx mengatakan "Tipe semua array F # adalah .NET Framework type Array", tapi lalu apa hubungan antara System.Array dan FSharp . Array umum generik?
Asik
Tidak ada array generik;) Mereka mungkin tipe nyata secara teknis, dan itu sebabnya generator msdn menjemput mereka, tetapi semua yang mereka definisikan adalah bagaimana kompiler harus mengembangkannya, jika saya membacanya dengan benar (file pertama yang saya tautkan) , dan beberapa metode ekstensi dalam file kedua. Hanya itu yang ada untuk itu. Buat salah satunya dan panggil GetType di atasnya. Ini akan menjadi tipe array khusus berdasarkan System.Array.
scrwtp
Atau lebih tepatnya, tipe statis itu sendiri adalah generik, tetapi tipe array runtime yang mereka bungkus tidak. Mungkin menerapkan inferensi tipe sedikit lebih mudah seperti itu, tapi itu dugaan liar.
scrwtp
5

Bagaimana C # mendukung tipe array khusus yang sangat diketik seperti int [] berdasarkan System.Array non-generik?

Sangat mungkin, dengan menghasilkan kelas khusus yang mewarisi System.Arraysejak generik tidak tersedia di 1.0. Perilaku ini kemungkinan telah dipertahankan untuk kompatibilitas.

Mengingat bahwa C # berhasil melakukan ini, mengapa F # mendefinisikan tipe array generik?

Karena F # tidak memiliki kendala kompabilitas yang sama seperti yang dimiliki C # 2.0 dengan kode yang ada. Berdasarkan apa yang saya ketahui, C # 2.0 akan memiliki tipe array generik jika itu adalah rilis pertama dari C #.

Telastyn
sumber