Как пользовательские типы F # отображаются на типы CLR? - PullRequest
3 голосов
/ 19 сентября 2010

Я не знаю, ясно ли название вопроса, но мне интересно, какие именно типы пользовательских F # типов существуют.

Как и в C #, существуют типы значений и ссылочные типы. Для F # существует ли один тип, который управляет системой типов?

Являются ли они всеми типами значений (поскольку они являются неизменяемыми по умолчанию)?

Или есть / есть совершенно новые типы, которые не имеют ничего общего со значением / ссылочными типами?

Любая информация будет полезна.

Ответы [ 4 ]

12 голосов
/ 19 сентября 2010

F # имеет различные виды типов.Стандартные типы .NET (которые также существуют в C #), такие как класс , интерфейсы и делегаты , отображаются непосредственно в соответствующее представление CLR.

Вы также можете определить тип значения , используя атрибут Struct (в этом случае вы получите тип, соответствующий C # struct) и перечисление , подобноеthis:

[<Struct>]
type ValueType(a:int) =
   member x.A = a

type Enumeration = 
  | First = 1
  | Second = 2

Остальные типы F # специфичны для F # и не имеют стандартного представления в CLR.Компилятор F # кодирует их как класс (или несколько классов).

  • Запись - это просто класс со свойствами, соответствующими полям записи.
  • Кортеж представлен с использованиемуниверсальный Tuple<...> класс (который является новым в .NET 4.0)

  • Значение функции представляется с использованием универсального типа FSharpFunc<...>.Это позволяет F # реализовать каррирование и частичное применение функции, так что это немного сложно.Например, int -> int -> int будет FSharpFunc<int, FSharpFunc<int, int>>.Тип имеет единственный метод Invoke, который можно использовать для вызова его с первым параметром.F # также генерирует производный тип, который содержит метод Invoke, принимающий все параметры, который является более эффективным и используется большую часть времени.

  • Дискриминационное объединение представлена ​​как иерархия классов с абстрактным базовым классом (с тем же именем, что и у типа объединения) и подклассом для каждого из случаев.Например:

    type Shape = 
      | Rectangle of int * int * int * int
      | Circle of int * int * int 
    

    Это создаст абстрактный базовый класс Shape и два производных конкретных класса Rectangle и Circle (фактически, вложенные классы в классе Shape).Эти производные классы будут содержать поля, необходимые для хранения свойств кейса (например, местоположение прямоугольника).

Если вы хотите узнать больше, вы можете взглянуть на Приключения в серии F # от Джомо Фишера.

3 голосов
/ 19 сентября 2010

ECMA 335 (CLI), § 8.5.2 называется: Типы значений и ссылочные типы

Они не являются концепцией только на C #.

2 голосов
/ 19 сентября 2010

Значения и ссылочные типы поступают из .NET, а не из C #. Не эксперт по F #, но я должен верить, что их типы одинаковы, поскольку это первоклассный язык .NET, и он говорит о совместимости с C #.

Кроме того, ссылочные типы могут быть неизменяемыми (например, String), а типы значений могут быть изменяемыми (как почти все в .NET) - они не имеют ничего общего с изменяемым / неизменным выбором.

Редактировать: исправлено на основе комментария.

1 голос
/ 19 сентября 2010

У вас также есть интерфейсы, классы и структуры в F # - они, как и ожидалось, сопоставляются с другими языками CLR, такими как C #, поэтому для целей интерфейса вам следует ограничиться этими типами.

Что касается различающихся объединений и записейсопоставление более сложное, а не то, что вы хотите сделать, если вам абсолютно не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...