F # Core neden genel dizi türlerini tanımlar?


11

Sadece FSharp.Core ad alanının 4 boyuta kadar genel dizi türlerini içerdiğini fark ettim, yani Core. [] <'T> , Core. [,] <' T>, vb. C # ve VB gayet iyi görünüyor. System.Array ile - int [], string [] gibi güçlü yazılan özel dizi türlerini nasıl destekleyebildikleri net olmasa da.

Sanırım bu iki soru olur:

  • C # genel olmayan System.Array tabanlı int [] gibi güçlü yazılan özel dizi türlerini nasıl destekler?
  • C # bunu yapmayı başarırsa, F # neden genel dizi türlerini tanımlar?

Yanıtlar:


8

F #, kendi başına genel dizi türlerini tanımlamaz. F # 'daki diziler, .NET kullanımıyla aynı dizi türündedir ve tersine işaret eden tüm sözdizimsel kanıtlara rağmen, bunlar genel değildir.

F # 'da yansımayı kullandığınızda bu bazen size geri tepebilir - array<int>mükemmel geçerli bir genel tip gibi görünseniz bile, onu incelediğinizde bir yanlış IsGenericType, bir doğru IsArrayve tür argümanını alırsınız. ile GetElementTypeziyade GetGenericArguments.

Telastyn'in cevabında belirttiği gibi, bu muhtemelen yaşamak zorunda kalacağımız .NET 1.0'ın eski bagajıdır. Ancak, yansıma API'sini F # 'da gerçek bir mayın alanı haline getiren birçok şeyden sadece biri.

F # 'ın tanımladığı şey, [], [,] ...karşılık gelen işlevlere sahip tür kısaltmaları / takma adları / işleçleri ve modülleridir, ancak hepsi sonuçta aşağıdaki aynı Dizi türünü ifade eder.

Github'daki kaynak koduna buradan ve burada kendiniz görmek için bakabilirsiniz .


Ancak bunlar tür takma adları değil, gerçek türler olarak listelenir. Karışık çünkü msdn.microsoft.com/en-us/library/dd233214.aspx "Tüm F # dizilerinin türü .NET Framework türü Dizidir" diyor, ancak System.Array ve FSharp arasındaki ilişki nedir? .Core genel dizileri?
Asik

Genel diziler yoktur;) Teknik olarak gerçek türler olabilirler ve bu yüzden msdn doc generator onları aldı, ancak tanımladıkları tek şey, doğru bir şekilde okursam derleyicinin onları nasıl genişletmesi gerektiğidir (bağladığım ilk dosya) ve ikinci dosyada birkaç uzantı yöntemi. Hepsi bu kadar. Bunlardan birini oluşturun ve üzerinde GetType'ı arayın. System.Array tabanlı özel bir dizi türü olacaktır.
scrwtp

Daha doğrusu, statik türlerin kendileri geneldir, ancak kaydırdıkları çalışma zamanı dizi türü değildir. Belki tür çıkarımı uygulamak bu şekilde biraz daha kolaydır, ancak bu vahşi bir tahmindir.
scrwtp

5

C # genel olmayan System.Array tabanlı int [] gibi güçlü yazılan özel dizi türlerini nasıl destekler?

Muhtemelen, System.Arrayjenerikler 1.0'da mevcut olmadığından beri miras kalan özel bir sınıf üreterek . Davranış muhtemelen uyumluluk için korunmuştur.

C # bunu yapmayı başarırsa, F # neden genel dizi türlerini tanımlar?

Çünkü F #, C # 2.0'ın mevcut kodla aynı uyumluluk kısıtlamalarına sahip değildi. Bildiklerime dayanarak, C # 2.0, C #'ın ilk sürümü olsaydı genel dizi türlerine sahip olurdu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.