유형 클래스
Type class컴퓨터 공학에서 유형 클래스는 애드혹 다형을 지원하는 유형 시스템 구조입니다.이는 매개 변수 다형 유형의 유형 변수에 구속조건을 추가하여 수행됩니다.이러한 제약에는 일반적으로 유형 클래스가 포함됩니다.T
및 유형 변수 a
, 그 의미는 다음과 같습니다.a
에 관련된 과부하 조작을 지원하는 멤버가 있는 유형에만 인스턴스화할 수 있습니다.T
.
형식 클래스는 Philip Wadler와 Stephen Blott에 의해 Standard [1][2]ML의 "eqtype"의 확장으로 처음 제안된 후 Haskell 프로그래밍 언어로 처음 구현되었으며, 원래는 과부하 산술 연산자와 등식 연산자를 원칙적인 [3][2]방식으로 구현하는 방법으로 생각되었습니다.표준 ML의 "eqtype"과는 달리, Haskell의 유형 클래스를 사용하여 등호 연산자를 오버로드하는 경우 컴파일러 프런트엔드 또는 기본 유형 [4]시스템의 광범위한 수정이 필요하지 않습니다.
그 생성 이후, 유형 클래스의 다른 많은 응용 프로그램이 발견되었습니다.
개요
유형 클래스는 클래스에 속하는 모든 유형에 대해 존재해야 하는 함수 집합 또는 상수 이름을 각각의 유형과 함께 지정하여 정의합니다.Haskell에서는 유형을 매개 변수화할 수 있습니다. 유형 클래스Eq
다음과 같은 방법으로 평등을 선언하는 형식을 포함하도록 의도되었다.
학급 이크 a 어디에 (==) :: a -> a -> 불 (/=) :: a -> a -> 불
어디에a
유형 클래스의 인스턴스 중 하나입니다.Eq
,그리고.a
는 2개의 함수(등함수 및 부등함수)에 대한 함수 시그니처를 정의합니다.각 함수는 2개의 타입의 인수를 사용합니다.a
부울을 반환합니다.
유형 변수a
has have cody *) 도 있습니다.Type
최신 GHC 릴리즈)[5]의 경우, 그 의미는 다음과 같습니다.Eq
이
이크 :: 유형 -> 제약
선언은 "유형"을 명시하는 것으로 해석될 수 있다.a
유형 클래스에 속함Eq
라는 이름의 함수가 있는 경우(==)
,그리고.(/=)
(적절한 타입으로 정의되어 있습니다).그러면 프로그래머는 함수를 정의할 수 있다.elem
(이것에 의해, 요소가 리스트에 있는지를 판별합니다)는, 다음과 같은 방법으로 행해집니다.
일람 :: 이크 a => a -> [a] -> 불 일람 y [] = 거짓의 일람 y (x:xs) = (x == y) 일람 y xs
함수elem
타입이 있다a -> [a] -> Bool
문맥에 따라Eq a
에는, 다음의 타입이 제약됩니다.a
그것들에까지 도달할 수 있다a
에 속합니다.Eq
type class를 입력합니다.(주의: Haskell =>
'클래스 제약'이라고 할 수 있습니다.
프로그래머는 어떤 타입이든 만들 수 있다.t
특정 유형 클래스의 멤버C
모든 구현을 정의하는 인스턴스 선언을 사용하여C
특정 유형에 대한 의 메서드t
예를 들어 프로그래머가 새로운 데이터 유형을 정의한 경우t
그 후, 이 새로운 타입을 의 인스턴스로 할 수 있습니다.Eq
유형 값에 대한 등식 함수를 제공함으로써t
그들이 적합하다고 생각하는 방식으로요.이 작업을 완료하면 다음 기능을 사용할 수 있습니다.elem
에[t]
즉, 유형의 요소 목록입니다.t
.
유형 클래스는 객체 지향 프로그래밍 언어의 클래스와 다릅니다.특히,Eq
타입이 아닙니다.타입의 값과 같은 것은 없습니다.Eq
.
유형 클래스는 파라메트릭 다형성과 밀접하게 관련되어 있습니다.예를 들어, 다음과 같은 타입이 있습니다.elem
위에서 지정한 바와 같이 파라미터 다형성 타입이 됩니다.a -> [a] -> Bool
타입 클래스 제약이 없었다면"Eq a =>
".
고등 다형성
유형 클래스는 유형의 유형 변수를 사용할 필요가 없습니다. Type
어떤 종류든 취할 수 있어요더 높은 종류를 가진 이러한 유형 클래스를 생성자 클래스라고 부르기도 합니다( 참조되는 생성자는 다음과 같은 유형 생성자입니다).Maybe
다음과 같은 데이터 컨스트럭터가 아닌Just
예를 들어 클래스입니다.
학급 모나드 m 어디에 돌아가다 :: a -> m a (>>=) :: m a -> (a -> m b) -> m b
m이 유형 변수에 적용된다는 사실은 m이 다음과 같은 특성을 가지고 있음을 나타냅니다.Type -> Type
예를 들어, 타입을 취하고 타입을 반환합니다.Monad
다음과 같습니다.
모나드 :: (유형 -> 유형) -> 제약
다중 매개 변수 유형 클래스
유형 클래스는 여러 유형 매개 변수를 허용하므로 유형 클래스는 [6]유형에 대한 관계로 볼 수 있습니다.예를 들어 GHC 표준 라이브러리에서 클래스는IArray
에 일반적인 불변의 어레이인터페이스를 나타냅니다.이 클래스에서 유형 클래스 제약 조건은IArray a e
라는 의미이다a
유형 요소를 포함하는 배열 유형입니다.e
(다형성에 대한 이 제한은 예를 들어 언박스의 어레이 타입을 구현하기 위해 사용됩니다.)
멀티메토드와[citation needed] 마찬가지로 멀티파라미터 타입 클래스는 여러 인수 유형에 따라 메서드의 다른 구현 호출을 지원합니다.또한 반환 유형도 지원합니다.멀티 파라미터 유형 클래스에서는 실행 [7]: minute 25:12 시 모든 콜에서 호출하는 메서드를 검색할 필요가 없습니다.콜하는 메서드는 싱글파라미터 유형 클래스와 마찬가지로 먼저 컴파일되어 타입 클래스인스턴스의 딕셔너리에 저장됩니다.
다중 파라미터 유형 클래스를 사용하는 Haskell 코드는 Haskell 98 표준에 포함되어 있지 않기 때문에 이식할 수 없습니다.일반적인 Haskell 구현인 GHC 및 Hugs는 다중 파라미터 유형 클래스를 지원합니다.
기능 의존성
Haskell에서는 타입 클래스가 개량되어 프로그래머가 관계형 데이터베이스 [8][9]이론에서 영감을 얻은 개념인 타입 파라미터 간의 함수 의존성을 선언할 수 있게 되었습니다.즉, 프로그래머는 타입 파라미터의 일부 서브셋의 할당이 나머지 타입 파라미터를 고유하게 결정한다고 단언할 수 있다.예를 들어 일반 모나드 m
타입의 상태 파라미터가 포함되어 있습니다.s
형식 클래스 제약 조건을 충족합니다.Monad.State s m
이 제약 조건에는 기능 의존성이 있습니다.m -> s
즉, 특정 모나드에 대해m
종류별Monad.State
, 에서 액세스 할 수 있는 상태m
고유하게 결정됩니다.이것은 타입 추론에 있어서 컴파일러를 돕고 타입 지향 프로그래밍에 있어서 프로그래머를 돕는다.
Simon Peyton-Jones는 [10]복잡하다는 이유로 Haskell에 기능적 의존성을 도입하는 것에 반대했다.
유형 클래스 및 암묵적 매개 변수
이 섹션은 어떠한 출처도 인용하지 않습니다.(2012년 1월 (이 의 방법과 을 확인합니다) |
유형 클래스와 암묵적 매개 변수는 매우 유사하지만 완전히 동일하지는 않습니다.다음과 같은 유형 클래스 제약 조건을 가진 다형 함수입니다.
합 :: 숫자 a => [a] -> a
예를 암묵적으로 받아들이는 기능으로서 직관적으로 취급할 수 있다Num
:
합계_ :: 숫자_ a -> [a] -> a
인스턴스Num_ a
기본적으로는 의 인스턴스 정의를 포함하는 레코드입니다.Num a
(실제로 글래스고 해스켈 컴파일러에 의해 타입 클래스가 후드 아래에서 구현되는 방법입니다.)
단, 중요한 차이가 있습니다.암묵적인 파라미터는 보다 유연합니다.즉, 다른 instance를 전달할 수 있습니다.Num Int
반면 유형 클래스는 이른바 일관성 속성을 적용합니다. 즉, 특정 유형에 대해 하나의 고유한 인스턴스 선택만 있어야 합니다.일관성 속성으로 인해 유형 클래스가 다소 안티모듈러 상태가 되기 때문에 분리된 인스턴스(클래스도 대상 유형도 포함되지 않은 모듈에서 정의된 인스턴스)는 권장되지 않습니다.한편, 일관성은 언어에 추가적인 안전 수준을 추가하여 프로그래머에게 동일한 코드의 두 개의 분리된 부분이 동일한 [11]인스턴스를 공유한다는 보장을 제공한다.
예를 들어 (타입의) 순서 집합Set a
에서는 (유형의) 요소에 대한 전체 순서가 필요합니다.a
기능을 하기 위해서).이것은 제약에 의해 증명될 수 있다.Ord a
요소에 대한 비교 연산자를 정의합니다.그러나 전체 주문을 부과하는 방법은 여러 가지가 있습니다.세트 알고리즘은 일반적으로 세트가 구성되면 순서 변경이 허용되지 않으므로 호환되지 않는 인스턴스를 전달합니다.Ord a
잘못된 결과를 초래할 수 있습니다(또는 충돌).따라서, 일관성을 강화하는 것은Ord a
매우 중요합니다.
Scala 유형 클래스의 인스턴스(또는 "사전")는 언어의 일반적인 값일 뿐 완전히 다른 종류의 [12][13]엔티티가 아닙니다.이러한 인스턴스는 명시적으로 선언된 암묵적 형식 파라미터의 암묵적 실제 파라미터로 사용되는 적절한 인스턴스를 범위 내에서 검색하여 기본적으로 제공되지만, 이러한 인스턴스가 일반 값이라는 것은 모호성을 해소하기 위해 명시적으로 제공될 수 있음을 의미합니다.그 결과, 스칼라형 클래스는 일관성을 만족시키지 못하고 암묵적 파라미터에 대한 통사당이다.
다음 예시는 Cats 문서에서 가져온 것입니다.
// 텍스트 표현을 제공하는 형식 클래스 특성 표시[A] { 방어하다 표시하다(f: A): 스트링 } // 암묵적인 함수가 있을 때만 기능하는 다형 함수 // Show[A] 인스턴스 사용 가능 방어하다 로그.[A](a: A)(암묵적인 s: 표시[A]) = 인쇄(s.표시하다(a)) // String 인스턴스 암묵적인 값 문자열 표시 = 신규 표시[스트링] { 방어하다 표시하다(s: 스트링) = s } // 파라미터 stringShow가 컴파일러에 의해 삽입되었습니다. 스칼라> 로그.('끈') a 스트링
Coq(버전 8.2 이후)에서는 적절한 인스턴스를 [15]추론하여 유형 클래스도 지원합니다.Agda 2의 최신 버전에서도 "instance [16]arguments"라고 불리는 유사한 기능을 제공합니다.
연산자 오버로드에 대한 기타 접근법
표준 ML에서 "균등 유형"의 메커니즘은 Haskell의 내장 유형 클래스와 대략 일치합니다.Eq
단, 모든 등호 연산자는 컴파일러에 의해 자동으로 파생됩니다.프로세서에 대한 프로그래머의 제어는 구조체의 어떤 유형 성분이 동등 유형인지와 다형 유형의 변수가 동등 유형보다 높은 범위를 갖는지를 지정하는 것으로 제한됩니다.
SML 및 OCaml의 모듈과 함수는 Haskell의 유형 클래스와 유사한 역할을 할 수 있으며, 주된 차이점은 유형 추론의 역할이며, 이는 유형 클래스를 특별 [17]다형에 적합하게 만든다.OCaml의 객체 지향 서브셋은 타입 클래스의 서브셋과 다소 유사한 또 다른 접근법입니다.
관련 개념
과부하 데이터(GHC에 실장)에 대한 유사한 개념은 [18]유형 패밀리의 개념입니다.
C++에서는 특히 C++20은 Concepts(C++)를 사용한 타입 클래스를 지원합니다.예시로 위에서 언급한 유형 클래스 Eq의 Haskell 예는 다음과 같이 기술됩니다.
템플릿 < >타이프네임 T> 개념. 동등. = 필요. (T a, T b) { { a == b } -> 표준::컨버터블_로< >부울>; { a != b } -> 표준::컨버터블_로< >부울>; };
Clean의 typeclasses는 Haskell과 비슷하지만 구문은 약간 다릅니다.
녹은 일관성이 [19]있는 제한된 형태의 유형 클래스인 특성을 지원합니다.
수은에는 활자 분류가 있지만, 정확히 [further explanation needed]하스켈과 같지는 않다.
Scala에서 type classes는 암묵적인 파라미터와 같은 기존 언어 기능을 사용하여 구현할 수 있는 프로그래밍 관용어입니다.단, 개별 언어 기능 자체가 아닙니다.Scala에서 구현되는 방식에 따라 모호할 경우 코드의 특정 위치에서 유형에 사용할 유형 클래스 인스턴스를 명시적으로 지정할 수 있습니다.그러나 모호한 유형 클래스 인스턴스는 오류가 발생하기 쉽기 때문에 이것이 반드시 이점은 아닙니다.
Proof Assistant Coq는 최근 버전에서 유형 클래스도 지원했습니다.일반 프로그래밍 언어와는 달리 Coq에서는 유형 클래스 정의 내에 기술된 유형 클래스의 법칙(모나드 법칙 등)을 사용하기 전에 각 유형 클래스 인스턴스에 대해 수학적으로 증명해야 합니다.
「 」를 참조해 주세요.
- 다형(컴퓨터 과학) (다른 종류의 다형)
- Haskell 프로그래밍 언어(유형 클래스를 처음 설계한 언어)
- 연산자 오버로드(타입 클래스의 응용 프로그램 1개)
- 모나드(기능 프로그래밍)(
Monad
는 타입 클래스의 예입니다). - 개념(C++) (C++20 이후)
- 러스트(프로그래밍 언어)
레퍼런스
- ^ Morris, John G. (2013). Type Classes and Instance Chains: A Relational Approach (PDF) (PhD). Department of Computer Science, Portland State University. doi:10.15760/etd.1010.
- ^ a b Wadler, P.; Blott, S. (1989). "How to make ad-hoc polymorphism less ad hoc". Proceedings of the 16th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (POPL '89). Association for Computing Machinery. pp. 60–76. doi:10.1145/75277.75283. ISBN 0897912942. S2CID 15327197.
- ^ Kaes, Stefan (March 1988). "Parametric overloading in polymorphic programming languages". Proc. 2nd European Symposium on Programming Languages. doi:10.1007/3-540-19027-9_9.
- ^ Appel, A.W.; MacQueen, D.B. (1991). "Standard ML of New Jersey". In Maluszyński, J.; Wirsing, M. (eds.). Programming Language Implementation and Logic Programming. PLILP 1991. Lecture Notes in Computer Science. Vol. 528. Springer. pp. 1–13. CiteSeerX 10.1.1.55.9444. doi:10.1007/3-540-54444-5_83. ISBN 3-540-54444-5.
- ^
Type
에서Data.Kind
글래스고 해스켈 컴파일러 버전 8에 등장했습니다. - ^ Haskell' 페이지 MultiParamTypeClasses.
- ^ GHC에서는 C Core는 Girard & Reynold의 System F 타입 서명을 사용하여 최적화 단계에서 처리하기 위한 타입 케이스를 식별합니다.-- Simon Peyton-Jones "Into the Core - Scrinzing Haskell to Nine Constructors" Erlang 사용자 컨퍼런스, 2016년 9월 14일
- ^ Jones, Mark P. (2000). "Type Classes with Functional Dependencies". In Smolka, G. (ed.). Programming Languages and Systems. ESOP 2000. Lecture Notes in Computer Science. Vol. 1782. Springer. pp. 230–244. CiteSeerX 10.1.1.26.7153. doi:10.1007/3-540-46425-5_15. ISBN 3-540-46425-5.
- ^ Haskell' 페이지 Functional Dependencies
- ^ Peyton-Jones, Simon (2006). "MPTCs and functional dependencies". Haskell-prime mailing list.
- ^ Kmett, Edward. Type Classes vs. the World. Boston Haskell Meetup. Archived from the original on 2021-12-21.
- ^ Oliveira, Bruno C.d.S.; Moors, Adriaan; Odersky, Martin (2010). "Type Classes as Objects and Implicits" (PDF). Proceedings of the ACM International Conference on Object Oriented Programming Systems Languages and Applications (OOPSLA '10). Association for Computing Machinery. pp. 341–360. CiteSeerX 10.1.1.205.2737. doi:10.1145/1869459.1869489. ISBN 9781450302036. S2CID 207183083.
- ^ "The Neophyte's Guide to Scala Part 12: Type classes - Daniel Westheide".
- ^ typelevel.org, Scala Cats
- ^ Castéran, P.; Sozeau, M. (2014). "A Gentle Introduction to Type Classes and Relations in Coq" (PDF). CiteSeerX 10.1.1.422.8091.
- ^ "인스턴스 인수를 사용하여 유형 클래스 모델링"입니다.
- ^ Dreyer, Derek; Harper, Robert; Chakravarty, Manuel M.T. (2007). "Modular Type Classes". Proceedings of the 34th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (POPL '07). pp. 63–70. See p. 63. doi:10.1145/1190216.1190229. ISBN 978-1595935755. S2CID 1828213. TR-2006-03.
- ^ "GHC/Type families - HaskellWiki".
- ^ Turon, Aaron (2017). "Specialization, coherence, and API evolution".
- Peyton Jones, Simon; Jones, Mark; Meijer, Erik (May 1997). "Type classes: an exploration of the design space". Proc. ACM SIGPLAN Haskell Workshop. CiteSeerX 10.1.1.1085.8703.
외부 링크
- "5. Type Classes and Overloading". A Gentle Introduction to Haskell. June 2000. Version 98.
- 위트레흐트 대학의 고급 기능 프로그래밍 과정, 74개의 고급 유형 수업에 대한 강의 슬라이드.2005-06-07.
- 유형 클래스 구현 및 이해2014-11-13.