Учебники

F # — Дженерики

Обобщения позволяют задерживать спецификацию типа данных элементов программирования в классе или методе до тех пор, пока они не будут фактически использованы в программе. Другими словами, дженерики позволяют вам написать класс или метод, который может работать с любым типом данных.

Вы пишете спецификации для класса или метода с параметрами замены для типов данных. Когда компилятор встречает конструктор для класса или вызов функции для метода, он генерирует код для обработки определенного типа данных.

В F # значения функций, методы, свойства и агрегатные типы, такие как классы, записи и различимые объединения, могут быть общими.

Общие конструкции содержат как минимум один параметр типа. Общие функции и типы позволяют вам писать код, который работает с различными типами, не повторяя код для каждого типа.

Синтаксис

Синтаксис для написания универсальной конструкции выглядит следующим образом:

// Explicitly generic function.
let function-name<type-parameters> parameter-list =
   function-body

// Explicitly generic method.
[ static ] member object-identifer.method-name<type-parameters> parameter-list [ return-type ] =
   method-body

// Explicitly generic class, record, interface, structure,
// or discriminated union.
type type-name<type-parameters> type-definition

Примеры

Live Demo

(* Generic Function *)
let printFunc<'T> x y =
   printfn "%A, %A" x y

printFunc<float> 10.0 20.0

Когда вы компилируете и запускаете программу, она выдает следующий вывод:

10.0, 20.0

Вы также можете сделать функцию универсальной, используя синтаксис одинарных кавычек —

Live Demo

(* Generic Function *)
let printFunction (x: 'a) (y: 'a) =
   printfn "%A %A" x y

printFunction 10.0 20.0

Когда вы компилируете и запускаете программу, она выдает следующий вывод:

10.0 20.0

Обратите внимание, что при использовании универсальных функций или методов вам может не потребоваться указывать аргументы типа. Однако в случае двусмысленности вы можете указать аргументы типа в угловых скобках, как мы это делали в первом примере.

Если у вас более одного типа, вы разделяете аргументы нескольких типов запятыми.

Общий класс

Как и универсальные функции, вы также можете писать универсальные классы. Следующий пример демонстрирует это —

Live Demo

type genericClass<'a> (x: 'a) =
   do printfn "%A" x

let gr = new genericClass<string>("zara")
let gs = genericClass( seq { for i in 1 .. 10 -> (i, i*i) } )

Когда вы компилируете и запускаете программу, она выдает следующий вывод: