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); ...]