Обобщения позволяют задерживать спецификацию типа данных элементов программирования в классе или методе до тех пор, пока они не будут фактически использованы в программе. Другими словами, дженерики позволяют вам написать класс или метод, который может работать с любым типом данных.
Вы пишете спецификации для класса или метода с параметрами замены для типов данных. Когда компилятор встречает конструктор для класса или вызов функции для метода, он генерирует код для обработки определенного типа данных.
В 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
Примеры
(* Generic Function *) let printFunc<'T> x y = printfn "%A, %A" x y printFunc<float> 10.0 20.0
Когда вы компилируете и запускаете программу, она выдает следующий вывод:
10.0, 20.0
Вы также можете сделать функцию универсальной, используя синтаксис одинарных кавычек —
(* Generic Function *) let printFunction (x: 'a) (y: 'a) = printfn "%A %A" x y printFunction 10.0 20.0
Когда вы компилируете и запускаете программу, она выдает следующий вывод:
10.0 20.0
Обратите внимание, что при использовании универсальных функций или методов вам может не потребоваться указывать аргументы типа. Однако в случае двусмысленности вы можете указать аргументы типа в угловых скобках, как мы это делали в первом примере.
Если у вас более одного типа, вы разделяете аргументы нескольких типов запятыми.
Общий класс
Как и универсальные функции, вы также можете писать универсальные классы. Следующий пример демонстрирует это —
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) } )
Когда вы компилируете и запускаете программу, она выдает следующий вывод: