Чому F # Core визначає загальні типи масивів?


11

Я щойно помітив, що простір імен FSharp.Core включає загальні типи масивів до 4-х вимірів, тобто Core. [] <'T> , Core. [,] <' T> і т. Д. C # і VB здаються відмінно з System.Array - хоча мені незрозуміло, як їм вдається підтримувати сильно типізовані спеціалізовані типи масивів, такі як int [], string [].

Я думаю, це стає двома питаннями:

  • Як C # підтримує сильно типізовані спеціалізовані типи масивів, такі як int [] на основі негенерованої System.Array?
  • Враховуючи, що C # вдається це зробити, чому F # визначає типи загальних масивів?

Відповіді:


8

F # не визначає загальні типи масивів самі по собі. Масиви в F # - це той же самий масив, що решта .NET використовує, і незважаючи на всі синтаксичні дані, що вказують на протилежне, вони не є загальними.

Іноді це може призвести до зворотного спалаху, коли ви використовуєте відображення у F # - навіть якщо у вас є показник, array<int>який представляється ідеально загальним родовим типом, при його перевірці ви отримуєте помилку від IsGenericTypeістинної IsArrayі отримуєте аргумент типу з GetElementTypeдосить тоді GetGenericArguments.

Як зазначав Теластин у своїй відповіді, це, швидше за все, застарілий багаж .NET 1.0, з яким нам доведеться жити. Але це лише одна з багатьох речей, яка робить використання API відбиття у F # справжнім мінним полем.

Те, що визначає F #, - це [], [,] ...абревіатури типу / псевдоніми / оператори та модулі з відповідними функціями, але в кінцевому підсумку всі вони посилаються на той самий тип масиву внизу.

Ви можете подивитися вихідний код на github тут і тут, щоб переконатися в цьому.


Але вони перераховані як реальні типи, а не псевдоніми типів. Я плутаюся, тому що msdn.microsoft.com/en-us/library/dd233214.aspx говорить: "Тип усіх масивів F # - це масив типу .NET Framework", але тоді, яка взаємозв'язок між System.Array і FSharp .Домаються загальні масиви?
Асик

Немає загальних масивів;) Технічно вони можуть бути реальними типами, і тому генератор msdn doc їх підбирав, але все, що вони визначають, - як компілятор повинен їх розширювати, якщо я читаю в нього правильно (перший файл, який я пов’язав) , а також кілька методів розширення у другому файлі. Це все, що там є. Створіть один із них та зателефонуйте на нього GetType. Це буде спеціалізований тип масиву на основі System.Array.
scrwtp

А точніше, самі статичні типи є загальними, але тип масиву виконання, який вони обгортають, не є. Можливо, таким чином реалізувати висновок про тип трохи легше, але це дике здогад
scrwtp

5

Як C # підтримує сильно типізовані спеціалізовані типи масивів, такі як int [] на основі негенерованої System.Array?

Дуже ймовірно, шляхом створення спеціалізованого класу, який успадковує, System.Arrayоскільки генерики були недоступними в 1.0. Таку поведінку, ймовірно, зберігали для сумісності.

Враховуючи, що C # вдається це зробити, чому F # визначає типи загальних масивів?

Оскільки F # не мав тих самих обмежень сумісності, які мали C # 2.0, з існуючим кодом. На основі того, що я знаю, C # 2.0 мав би загальні типи масивів, якби це був перший випуск C #.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.