F # - Genéricos
Os genéricos permitem atrasar a especificação do tipo de dados dos elementos de programação em uma classe ou método, até que sejam realmente usados no programa. Em outras palavras, os genéricos permitem que você escreva uma classe ou método que pode funcionar com qualquer tipo de dados.
Você escreve as especificações para a classe ou o método, com parâmetros substitutos para os tipos de dados. Quando o compilador encontra um construtor para a classe ou uma chamada de função para o método, ele gera o código para lidar com o tipo de dados específico.
Em F #, valores de função, métodos, propriedades e tipos de agregação, como classes, registros e uniões discriminadas, podem ser genéricos.
Construções genéricas contêm pelo menos um parâmetro de tipo. Tipos e funções genéricas permitem que você escreva código que funcione com uma variedade de tipos sem repetir o código para cada tipo.
Sintaxe
A sintaxe para escrever uma construção genérica é a seguinte -
// 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
Exemplos
(* Generic Function *)
let printFunc<'T> x y =
printfn "%A, %A" x y
printFunc<float> 10.0 20.0
Quando você compila e executa o programa, ele produz a seguinte saída -
10.0, 20.0
Você também pode tornar uma função genérica usando a sintaxe de aspas simples -
(* Generic Function *)
let printFunction (x: 'a) (y: 'a) =
printfn "%A %A" x y
printFunction 10.0 20.0
Quando você compila e executa o programa, ele produz a seguinte saída -
10.0 20.0
Observe que quando você usa funções ou métodos genéricos, pode não ser necessário especificar os argumentos de tipo. No entanto, em caso de ambigüidade, você pode fornecer argumentos de tipo entre colchetes angulares, como fizemos no primeiro exemplo.
Se você tiver mais de um tipo, separe vários argumentos de tipo com vírgulas.
Classe Genérica
Como funções genéricas, você também pode escrever classes genéricas. O exemplo a seguir demonstra isso -
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) } )
Quando você compila e executa o programa, ele produz a seguinte saída -
"zara"
seq [(1, 1); (2, 4); (3, 9); (4, 16); ...]