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 # от Джомо Фишера.