F #-제네릭
Generics를 사용하면 프로그램에서 실제로 사용될 때까지 클래스 또는 메서드에서 프로그래밍 요소의 데이터 유형 지정을 지연 할 수 있습니다. 즉, 제네릭을 사용하면 모든 데이터 유형과 함께 작동 할 수있는 클래스 또는 메서드를 작성할 수 있습니다.
데이터 유형에 대한 대체 매개 변수를 사용하여 클래스 또는 메소드에 대한 스펙을 작성합니다. 컴파일러가 클래스에 대한 생성자 또는 메서드에 대한 함수 호출을 발견하면 특정 데이터 유형을 처리하는 코드를 생성합니다.
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) } )
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
"zara"
seq [(1, 1); (2, 4); (3, 9); (4, 16); ...]