템플릿에서는 C++편집

주요 문서 템플릿(C++)

C++템플릿을 사용하여 사용하려면 일반적인 프로그래밍 기법입니다. C++표준 라이브러리 포함되어 있는 표준 템플릿 라이브러리 또는 STL 는 프레임워크를 제공합 템플릿에 대한 일반적인 데이터 구조와 알고리즘이 있습니다. 템플릿에서는 C++에도 사용할 수 있습니다 템플릿과 메타 프로그래밍하는 방법으로 사전 평가의 일부에서 코드를 컴파일 시간보다는 실행 시간입니다. 템플릿 전문화를 사용하여 C++템플릿은 튜링 완료로 간주됩니다.,

Technical overviewEdit

함수 템플릿과 클래스 템플릿의 두 가지 종류가 있습니다. 함수 템플릿은 인스턴스화 할 때 제공되는 매개 변수화 유형을 기반으로 일반 함수를 만드는 패턴입니다. 예를 들어,C++표준 템플릿 라이브러리 함수가 포함 템플릿 max(x,y)를 만드는 함수 중 하나를 반환 x,y,둘 중 큰 값., max()할 수 있는 다음과 같이 정의한다:

template <typename T>T max(T x, T y) { return x < y ? y : x;}

전문화의 이 기능 템플릿,인스턴스화와 특정한 형식이라고 할 수 있습처럼 보통 기능:

std::cout << max(3, 7); // Outputs 7.

컴파일러는 검사 인수를 호출하는 데 사용되는 맥스와 결정 하는 이 max(int,int)., 그 다음 인스턴스화 버전의 기능 매개 변수화 유형 T int 을 만들고,해당하는 다음과 같은 기능:

int max(int x, int y) { return x < y ? y : x;}

이 작동하는지 여부를 인수한 x 와 y 값이 정수,문자열,또는 다른 유형을 위한 식 x<y 는 합리적인,또는 좀 더 구체적으로, 모든 유형에 대해 연산자<가 정의됩니다. 일반적인 상속은 사용할 수있는 유형 집합에 필요하지 않으므로 오리 타이핑과 매우 유사합니다., 프로그램을 정의 사용자 지정 데이터 형식을 사용할 수 있는 운영자 과부하를 정의의 의미는<유형에 따라서 그 사용을 허용 max()함수는 템플릿입니다. 하는 작은 혜택 이 절연를 들어,컨텍스트에서의 포괄적인 라이브러리와 같은 STL 수 있는 프로그래머를 얻을 광범위한 기능을 위해 새로운 데이터 형식으로 정의하는 몇 가지 운영자니다., 단순히 정의하기<할 수 있습에 사용되는 형식을 표준으로 정렬(),stable_sort()및 binary_search()또는 알고리즘을 안에 넣어 같은 데이터 구조트,힙 및 연관 배열입니다.

c++템플릿은 컴파일 타임에 완전히 안전합니다. 데모로,표준 형식의 복잡한 정의하지 않는<연산자가 없기 때문에,엄격하기 위해서는 복잡한 숫자입니다. 따라서 x 와 y 가 복소수 값인 경우 최대(x,y)는 컴파일 오류로 실패합니다., 마찬가지로,다른 템플릿에 의존하는<에 적용할 수 없습니다 복잡한 데이터의 비교(의 형태로 펑터 또는 기능)에 제공됩니다. 예:비교가 제공되지 않으면 컴플렉스를지도의 키로 사용할 수 없습니다. 불행히도 컴파일러는 역사적으로 이러한 종류의 오류에 대해 다소 난해한 길고 도움이되지 않는 오류 메시지를 생성합니다. 특정 객체가 메소드 프로토콜을 준수하는지 확인하면이 문제를 완화 할 수 있습니다. <대신 compare 를 사용하는 언어는 복잡한 값을 키로 사용할 수도 있습니다.,

두 번째 종류의 템플릿 클래스 템플릿,확장 같은 개념이다. 클래스 템플릿 전문화는 클래스입니다. 클래스 템플릿은 종종 일반 컨테이너를 만드는 데 사용됩니다. 예를 들어 STL 에는 연결된 목록 컨테이너가 있습니다. 연결된 정수 목록을 만들려면 list<int>를 씁니다. 문자열 목록은 list<string>로 표시됩니다. 목록에는 그와 관련된 표준 함수 집합이 있으며 호환되는 모든 매개 변수화 유형에 대해 작동합니다.,

템플릿 specializationEdit

C++의 템플릿의 강력한 기능은 템플릿 전문화입니다. 이를 통해 인스턴스화되는 매개 변수화 된 유형의 특정 특성을 기반으로 대체 구현을 제공 할 수 있습니다. 템플릿 전문화는 특정 형태의 최적화를 허용하고 코드 팽창을 줄이는 두 가지 목적을 가지고 있습니다.예를 들어 sort()템플릿 함수를 고려하십시오. 이러한 함수가하는 주요 활동 중 하나는 컨테이너의 위치 중 두 곳에서 값을 교환하거나 교환하는 것입니다., 는 경우 값은 큰(수의 측면에서의 바이트는 그것을 저장하는 그들 각각의),다음은 자주 빠르게 첫 번째 빌드이 별도록 포인터의 개체,정렬,그 점슛,을 구축 후 최종 정렬 순서입니다. 는 경우 값은 아주 작은 그러나 그것은 일반적으로 가장 빠른을 교환하는 값에 놓으로 필요합니다. 는 경우,또한 매개 변수가 형식은 이미의 일부를 포인 형식은 없을 구축 할 필요가 별도의 포인터 배열입니다., 템플릿을 전문화할 수 있는 템플릿자를 쓰는 다른 구현 및을 지정하는 특성을 매개 변수가 있는 입력(s)야에 대한 각각의 구현을 사용합니다.

함수 템플릿과 달리 클래스 템플릿은 부분적으로 특수화 될 수 있습니다. 즉 다른 버전의 클래스 코드 템플릿 제공할 수 있을 때의 일부 템플릿을 매개변수를 알려져 있는 동안,다른 템플릿을 매개 변수는 일반적입니다., 이 사용할 수 있습니다,예를 들어,을 만들기 기본 구현은(주 전문성)는 가정을 복사하는 것은 매개 변수화 유형은 비싸고 다음 부분을 만들에 대한 전문화 형식은 저렴한 복사,따라서 증가하고 전반적인 효율성이다. 클라이언트가 이러한 클래스의 템플릿을 사용 특성화없이 그것을 알 필요 여부를 컴파일러에 사용되는 기본 특성화 또는 일부 부분에 전문화합니다., 클래스 템플릿을 수도 있습이 완전히 전문 즉,다른 구현을 제공할 수 있을 때 모두 매개 변수화 유형을 알려져 있습니다.

장점과 disadvantagesEdit

일부의 사용과 같은 템플릿 max()함수,이전에 함수에 의해 채워기 매크로(의 유산 C 프로그래밍 언어). 예를 들어,여기에 가능한 최대()매크로.

#define max(a,b) ((a) < (b) ? (b) : (a))

매크로를 확대하여 전처리,컴파일하기 전에 적절한;템플릿을 확장 컴파일때 정해진다., 매크로는 항상 인라인으로 확장되며 컴파일러가 적합하다고 판단 할 때 템플릿을 인라인 함수로 확장 할 수도 있습니다. 따라서 함수 유사 매크로와 함수 템플릿 모두 런타임 오버 헤드가 없습니다.

그러나,템플릿은 일반적으로 간주 개선을 통해 매크로를 이러한 목적을 위해. 템플릿은 유형 안전합니다. 템플릿을 이해하기 위해 일반적인 오류에서 발견되는 코드 사용의 기능과 같은 매크로,같은 평가를 매개 변수와 부작용이다. 아마도 가장 중요한 것은 템플릿이 매크로보다 훨씬 큰 문제에 적용 할 수 있도록 설계되었다는 것입니다.,

있는 네 개의 주요 단점을 사용 템플릿의:지원하는 기능을 컴파일러를 지원하는지,가난한 오류 메시지,그리고 코드 블:

  1. 템플릿에서는 C++부족 많은 기능을 만드는 구현하고 그들을 사용하여 간단한 방법으로 종종 불가능합니다. 대신 프로그래머는 부풀어 오르고 이해하기 어렵고 코드를 유지하기가 어려운 복잡한 트릭에 의존해야합니다. 현재 개발에서는 C++표준이 문제를 더욱 심하게 만들어 무거운 사용하여 이러한 트릭의 건축의 많은 새로운 기능을 위한 템플릿에서 그들이 나와서 그들을 마음입니다.,
  2. 많은 컴파일러는 역사적으로 템플릿에 대한 지원이 좋지 않으므로 템플릿을 사용하면 코드를 다소 덜 이식 할 수 있습니다. 을 지원할 수 있습도 가난한 경우 C++컴파일러 사용으로 링커지 않는 C++-인식 또는 시도할 때 사용하는 템플릿에 걸쳐 공유 라이브러리 경계. 가장 현대적인 컴파일러 그러나 이제 상당히 강력하고 표준 템플릿을 지원하고,새로운 C++standard C++11,더 주소를 이러한 문제를 해결합니다.
  3. 거의 모든 컴파일러에서 생산하는 혼란,장거나,때로는 도움이 안되면 오류 메시지 오류는 발견되는 코드에서는 템플릿을 사용합니다., 이로 인해 템플릿이 개발되기 어려울 수 있습니다.
  4. 마침내 템플릿을 사용하여 사용을 필요로 생성하는 컴파일러는 별도의 인스턴스의 템플릿 클래스 또는 함수에 대한 순열 모든 유형의 매개 변수를 사용합니다. (이것은 C++의 유형이 모두 같은 크기가 아니며 데이터 필드의 크기가 클래스 작동 방식에 중요하기 때문에 필요합니다.)따라서 템플릿을 무차별 적으로 사용하면 코드가 부풀어 오르고 실행 파일이 과도하게 커질 수 있습니다., 그러나 현명한 사용 템플릿의 전문성과 도출을 극적으로 줄일 수 있습 그러한 코드에 부풀게 어떤 경우:

할 수 있는 파생을 줄이기 위해 사용될의 문제 코드를 복제하기 때문에 템플릿을 사용하고 있습니까? 이것은 일반 클래스에서 템플릿을 파생시키는 것을 포함합니다. 이 기술은 실제 사용에서 코드 팽창을 억제하는 데 성공한 것으로 입증되었습니다. 하지 않는 사람들이 사용하는 기술이 있는 것을 발견 복제 코드할 수 있는 비용 mb 의 코드 스페이스에도 적당한 크기 프로그램입니다.,

—비얀 표시,디자인과 진화의 C++,1994 년

추가 인스턴스화에 의해 생성된 템플릿을 일으킬 수도 있습 디버거 어려움이 정상적으로 작동하와 함께 템플릿이 있습니다. 예를 들어,설정 디버 중단점 이내 템플릿에서는 원본 파일 중 하나를 놓치 설정에서 중단점을 실제 인스턴스화하거나 설정할 수 있습니다 중단점을 모든 곳에서는 템플릿.,

기 때문에 또한,컴파일러가 필요로 수행하는 매크로 처럼 확장의 템플릿을 생성하는 다른 경우 그들 중에서 컴파일 시간 구현에 대한 소스 코드 템플릿 클래스 또는 기능을 사용할 수 있어야 합니다(예를 들어에 포함되는 헤더)를 사용하여 코드습니다. 템플릿 클래스 또는 기능을 포함한 많은 표준 템플릿 라이브러리(STL),에 포함되지 않은 경우 헤더 파일을 컴파일할 수 있습니다. (이것은 비 템플릿화 코드,할 수 있는 컴파일을 바이너리,만 제공하는 선언의 헤더 파일을 사용하여 코드습니다., 다)이 될 수 있는 단점을 노출하여 구현하는 코드를 제거하는 일부의 추상화와 수는 그 사용을 제한에 폐쇄 소스 프로젝트입니다.DEdit 의

템플릿

D 프로그래밍 언어는 c++의 디자인 기반 템플릿을 지원합니다.,대부분의 C++템플릿 관용구를 수행하 D 없이 변경하지만,D 추가 기능:

  • 템플릿을 매개 변수에서만 제한하지 않고 형식과 기본 값이지만,또한 임의 컴파일 시간 값(예:문자열 및 구조체 리터럴),그리고 별칭을 임의의 식별자를 포함하여 다른 템플릿 또는 템플릿에 인스턴스화.
  • 템플릿 제약 조건 및 정적 if 문은 c++의 대체 실패에 대한 대안을 제공합니다 C++개념과 유사한 오류(SFINAE)메커니즘이 아닙니다.리>는(…,)표현식은 컴파일 타임에 객체의 특성을 확인하기 위해 투기 적 인스턴스화를 허용합니다.
  • 자동차 키워드 typeof 식 허용 입력추를 위한 변수를 선언하고 기능 값을 반환 할 수 있도록”몰두한 형식”(유형이 없는 글로벌 이름).

템플릿에서 사용하는 다른 문법보다는 C++에서는 C++템플릿을 매개 변수를 감싸에서 각괄호(템플릿<param1,param2>),D 사용하는 느낌표 기호 및 괄호:템플릿!(param1,param2).,이렇게하면 비교 연산자와의 모호성으로 인해 c++구문 분석 어려움을 피할 수 있습니다.매개 변수가 하나만있는 경우 괄호를 생략 할 수 있습니다.

종래,d 는 형질 기반 제네릭 프로그래밍을 사용하여 컴파일 타임 다형성을 제공하기 위해 위의 기능을 결합합니다.,예를 들어,입력 범위를 정의로 모든 유형을 만족하는 검사를 수행하여 isInputRange 는 다음과 같이 정의된다:

는 기능이만 허용 입력 범위는 다음을 사용하여 위 템플릿에서는 템플릿 제약

auto fun(Range)(Range range) if (isInputRange!Range){ // ...}
코드 generationEdit

이외에는 템플릿과 메타 프로그래밍, D 는 또한 제공합니다 여러 기능을 사용하려면 컴파일 타임 코드 생성.

  • 가져오기 표현할 수 있을 읽는 파일에서 디스크를 사용하여 그 내용이 문자열로 표현합니다.,
  • 컴파일 타임 리플렉션을 사용하면 컴파일 중에 선언 및 해당 멤버를 열거하고 검사 할 수 있습니다.
  • 사용자-정의된 특성을 허용할 사용자는 첨부하는 임의의 식별을 선언할 수 있는 열거를 사용하여 컴파일 시간 반영합니다.
  • 컴파일 타임 함수 실행(CTFE)은 컴파일 중에 d(안전한 작업으로 제한됨)의 하위 집합을 해석 할 수있게합니다.
  • String mixins 를 사용하면 문자열 표현식의 내용을 프로그램의 일부가되는 d 코드로 평가하고 컴파일 할 수 있습니다.,

위의 내용을 결합하면 기존 선언을 기반으로 코드를 생성 할 수 있습니다.예를 들어,D serialization 프레임워크에 열거할 수 있는 형식의 구성원과 생성을 전문화된 기능을 위해 각 직렬화 typeto 직렬화를 수행하고 직렬화.사용자 정의 특성은 직렬화 규칙을 추가로 나타낼 수 있습니다.

가져 오기 표현식 및 컴파일 타임 함수 실행은 도메인 별 언어를 효율적으로 구현할 수 있습니다.,예를 들어,사용하는 함수가 포함된 문자열 HTML 템플릿 및 반환에 해당 D 소스 코드,그것은 그것을 사용하는 방법은 다음과 같습니다.

제네릭함에 EiffelEdit

일반적인 클래스의 일부가 되었습관 때문에 원래 방법과 언어를 디자인합니다. 에펠(Eiffel)의 기초 간행물은 제네릭 클래스의 생성과 사용을 설명하기 위해 일반성이라는 용어를 사용합니다.

기본/제약 genericityEdit

일반적인 클래스로 선언된 자신의 클래스에 이름 목록을 하나 또는 형식적인 일반적인 매개 변수입니다., 다음 코드에서는 클래스가LIST는 하나의 형식적인 일반적인 매개 변수를G

형식적인 일반적인 매개변수가 자리한 임의의 클래스 이름이 공급될 때는 선언의 일반적인 클래스를 만들과 같이 두 가지 일반적인 파생 아래 여기서ACCOUNTDEPOSIT는 다른 클래스 이름. ACCOUNTDEPOSIT간주되는 실제적인 일반적인 매개 변수를 제공하므로 실제 클래스 이름을 대신G에서는 실제 사용.,

 list_of_accounts: LIST -- Account list list_of_deposits: LIST -- Deposit list

에서 파리는 유형 시스템이지만,클래LIST 간주되는 등,그것은 고려하지 않는 유형입니다. 그러나,일반적인 파생의LIST 등과 같은LIST 유형으로 간주됩.

제한 genericityEdit

에 대한 목록 클래스 위에 표시된 실제적인 일반적인 매개 변수를 대체하는G될 수 있는 어떤 사용 가능한 다른 클래스입니다., 을 제한하는 설정의 클래스에서는 유효한 실제적인 일반적인 매개변수를 선택할 수 있습니다 일반적인 제약 조건을 지정할 수 있습니다. 선언에서 클래스의SORTED_LIST아래,일반적인 제약 조건을 지시는 모든 유효한 실제적인 일반적인 매개 변수가 될 것입니다 클래스를 상속하는 클래스에서COMPARABLE. 일반 제약 조건은SORTED_LIST의 요소를 실제로 정렬 할 수 있도록합니다.,

class SORTED_LIST 

제네릭 JavaEdit

주 제:Generics 에서 Java

에 대한 지원을 제네릭,또는”컨테이너의 유형-T”추가되었는 Java 프로그래밍 언어 2004 년에서의 일환으로 J2SE5.0. Java 에서 제네릭은 형식 정확성에 대해 컴파일 타임에 만 검사됩니다. 그런 다음 generic type 정보는 type erasure 라는 프로세스를 통해 제거되어 이전 JVM 구현과의 호환성을 유지하므로 런타임에 사용할 수 없게됩니다., 예를 들어 List<String>는 원시 유형 목록으로 변환됩니다. 컴파일러가 삽입 유형 캐스팅을 변환하는 요소의 문자열을 입력할 때 검색 목록에서 감소,성과에 비해 다른 구현 등의 C++템플릿이 있습니다.

.NET Edit 의 Genericity

제네릭은 1999 년에 시작된 Microsoft Research 의 연구 프로토 타입을 기반으로 2005 년 11 월.NET Framework2.0 의 일부로 추가되었습니다. 자바에서 제네릭과 유사하지만,.,NET generics 는 유형 지우기를 적용하지 않지만 reification 을 사용하여 런타임에서 첫 번째 클래스 메커니즘으로 generics 를 구현합니다. 이 설계 선택을 추가 기능을 제공과 같은 허용 반사와의 보존 일반 형식뿐만 아니라,경감의 일부 제한 사항의 삭제(과 같은 것을 만들 수 없습니 일반적인 배). 이것은 또한 런타임 캐스트와 일반적으로 값 비싼 복싱 변환으로 인한 성능 타격이 없음을 의미합니다., 프리미티브 및 값 유형이 제네릭 인수로 사용될 때 특수화 된 구현을 얻으므로 효율적인 제네릭 컬렉션 및 메소드가 가능합니다. 로 C++및 Java,중첩된 일반적인 형식과 같은 사전<string,List<int>>유효한 유형,그러나 바랍에 대해 회원의 서명에 코드 디자인 분석 규칙이 있습니다.피>.,순할 수 있습 여섯 종류의 일반적인 입력 제약 조건을 사용하는 키워드를 포함하여 제한하는 일반적인 유형을 가치 유형,를 클래스를 생성자,그리고 구현하는 인터페이스가 있습니다. 아래 예와 인터페이스는 제약

MakeAtLeast()메서드를 사용 작업에서 배열 요소와의 일반적인 T 형식 메서드의 입력 제약 조건을 나타내는 방법이 적용 가능한 모든 유형 T 를 구현하는 일반적인 IComparable<T>인터페이스입니다., 이렇게하면 형식이 비교를 지원하지 않는 경우 메서드가 호출되는 경우 컴파일 시간 오류가 보장됩니다. 인터페이스는 일반 메소드 CompareTo(T)를 제공합니다.

위의 메소드는 제네릭 형식없이 작성 될 수도 있으며 단순히 제네릭이 아닌 배열 형식을 사용합니다. 그러나,이후 배열은 반공변,주조되지 않을 것 형,안전과 컴파일러는 것을 찾을 수 없습 특정 가능한 오류는 그렇지 않으면 붙잡을 때 사용하는 일반적인 형식입니다. 또한 메서드는 대신 객체로 배열 항목에 액세스해야하며 두 요소를 비교하기 위해 캐스팅이 필요합니다., (값에 대한 형식과 같은 형식 등 int 이 필요합 복싱 변환 될 수 있지만 주위에 근무를 사용하는 비교<T>클래스에서 수행되는 표준 컬렉션됩니다.)

주목할 만한 동작의 정원에서 일반적입니다.NET 클래스는 정적 멤버 인스턴스화당 실시간 형식(아래 예제 참조).DelphiEdit 의

Genericity

Delphi 의 Object Pascal diabol 은 Delphi2007 릴리스에서 제네릭을 획득했으며,처음에는(현재 중단 됨).,델파이 2009 릴리스의 네이티브 코드에 추가되기 전에 넷 컴파일러. Delphi generics 의 의미와 기능은 NET2.0 의 generics 가 가진 것을 크게 모델링하지만 구현은 필요에 따라 상당히 다릅니다. 여기에 더 많거나 적은 직접 번역의 첫 번째 C#예제는 다음과 같은 위

으로 C#,방법뿐만 아니라 전체 종류 수 있는 하나 이상의 유형 매개 변수입니다. 이 예에서 TArray 는 제네릭 형식(언어로 정의)이며 제네릭 메서드를 만듭니다., 사용 가능한 제약 조건 매우 유사하게 사용할 수 있는 제약 C#의:모든 값을 입력,모든 클래스,특정 클래스 또는 인터페이스,그리고 클래스를 매개 변수가 없는 생성자입니다. 다중 제약 조건은 가산 조합으로 작용합니다.

Free PascalEdit 의 Genericity

Free Pascal 은 Delphi 앞에 제네릭을 구현했으며 구문과 의미가 다릅니다. 그러나 fpc 버전 2.6.0 부터{$mode Delphi}언어 모드를 사용할 때 Delphi 스타일 구문을 사용할 수 있습니다. 따라서 무료 파스칼 프로그래머는 자신이 선호하는 스타일로 제네릭을 사용할 수 있습니다.,

Delphi 및 Free Pascal 예제:

기능적 languagesEdit

Haskelledit 의 일반성

하스켈의 유형 클래스 메커니즘은 일반 프로그래밍을 지원합니다.여섯 개의 사전 정의된 형식 클래스에서켈(Eq 를 포함하여 유형을 비교할 수 있는 동등한 보여,이 유형이 그 값을 렌더링할 수 있습니다 문자열로)의 특별한 시설을 지원하는 파생 인스턴스가 있습니다., 즉,프로그래머의 정의를 새로 입력할 수 있는 상태를 이 유형이 인스턴스가 될 이들 중 하나의 특별한 형식 클래스지 않고,구현을 제공하는 클래스의 방법으로 일반적으로 필요를 선언할 때 클래스의 인스턴스가 있습니다. 필요한 모든 방법은”파생”될 것입니다–즉,유형의 구조에 따라 자동으로 구성됩니다.,예를 들어,다음과 같은 선언문의의 유형에 바이너리 나무는 그것의 인스턴스 클래스 Eq 및 보여주기:

data BinTree a = Leaf a | Node (BinTree a) a (BinTree a) deriving (Eq, Show)

이 결과에 동등 기능(==)문자열의 표현 기능(보여)되고 자동으로 정의에 대한 모든 유형의 형태 데이터 관리의 기본적인 동작 T T 체 지원 합니다.,

지원을 위한 파생의 인스턴스 Eq 보여 자신의 방법을==표시 일반에 질적으로 다른 방법으로서 para-metrically 다형수:이러한 기능을””(더 정확하게 입력 인덱스가 가족의 기능)에 적용할 수 있는 값의 다양한 유형,그리고 있지만 그들은 다르게 행동에 대한 모든 인수 유형,작은 일은 필요한 지원을 추가하는 새로운 유형입니다. 랄프 Hinze(2004 년)에 있는 비슷한 효과를 얻을 수 있습에 대한 사용자 정의 형식의 클래스에 의해 특정 프로그래밍 기법입니다., 다른 연구자들은 제안된 접근 방식이 다른 종류의 제네릭함에서의 컨텍스트 메 및 확장을켈(아래에 설명).

PolyPEdit

PolyP 는 하스켈의 첫 번째 일반 프로그래밍 언어 확장이었습니다. 폴립에서는 일반 함수를 폴리 타이픽이라고합니다. 언어를 소개하고 특별한 구성에서는 이러한 polytypic 기능을 정의할 수 있습을 통해 구조적 유도 통해 구조의 패턴 함수의 일반 데이터 형식. 폴립의 일반 데이터 유형은 하스켈 데이터 유형의 하위 집합입니다., 일정 데이터 형식 t 야의 종류에*→*및 경우에는 공식적인 형식 인수를 정의에서,모든 재귀적화하 t 이 있어야 합 형태 t 니다. 이러한 제한 규칙을 높-kinded 데이터 형식뿐만 아니라 중첩된 데이터 형식,는 재귀 호출의 다른 형태입니다.평면에서 함수 용종이 여기에 제공 예를 들어:

일반 HaskellEdit

일반켈 또 다른 확장자를켈,개발에서 위트레흐트 대학교에서 네덜란드., 이 확장은 그것을 제공합니다:

  • Type-인덱스 값이 정의의 값으로 색인을 통해 다양한켈 입력 생성자(단위,원시적인 형태,금액,제품 및 사용자 정의 형식의 생성자). 또한,우리는 우리를 지정할 수도 있습니다 행동의 유형-인덱싱에 대한 값에 특정 생성자를 사용하여 생성자의 경우,그리고 다시 사용 중 하나는 일반적인 정의에서 다른 사용하는 기본값 경우입니다.

결과 유형 색인 값은 모든 유형에 특화 될 수 있습니다.

  • Kind-indexed types 는*와 k→k’모두에 대한 사례를 제공하여 정의 된 종류보다 색인 된 유형입니다., 인스턴스는 종류 색인 유형을 종류에 적용하여 얻습니다.
  • 일반 정의는 유형 또는 종류에 적용하여 사용할 수 있습니다. 이를 일반 응용 프로그램이라고합니다. 결과는 어떤 종류의 일반 정의가 적용되는지에 따라 유형 또는 값입니다.
  • 일반 추상화를 사용하면 형식 매개 변수(주어진 종류의)를 추상화하여 일반 정의를 정의 할 수 있습니다.
  • Type-indexed types 는 유형 생성자를 통해 인덱싱되는 유형입니다. 이것들은 더 관련된 제네릭 값에 유형을 부여하는 데 사용될 수 있습니다., 결과 유형-색인 유형은 모든 유형에 특화 될 수 있습니다.

예를 들어,평등 기능에 일반일:

CleanEdit

깨끗이 제공하는 일반적인 프로그래밍 기반으로 폴리프와 일반켈로에서 지원하는지 지정할>=6.0. 그것은 그와 같은 종류로 매개 변수하지만 과부하를 제공합니다.

기타 languagesEdit

의 프로그래밍 언어의 지원이 일반적인 프로그래밍을 통해 파라미터 다형성과 일반적인 모듈이라는 함수.,표준 ML 및 OCaml 은 모두 펑터를 제공하며 클래스 템플릿 및 Ada 의 일반 패키지와 유사합니다. 체계 구문적 추상화한 연결을 제네릭함–이러한 사실은 상위 집합의 템플릿 라 C++.

Verilog 모듈은 모듈의 인스턴스화에 따라 실제 값이 할당되는 하나 이상의 매개 변수를 취할 수 있습니다. 한 가지 예는 배열 너비가 매개 변수를 통해 주어진 일반 레지스터 배열입니다., 이러한 배열과 결합,제네릭 와이어 벡터를 만들 수 있습니다,일반적인 버퍼 메모리 모듈로 임의로 조금 폭을 하나의 모듈로 구현한다.Ada 에서 파생 된

VHDL 도 일반적인 기능을 가지고 있습니다.피>