일반 대수 데이터 유형

Generalized algebraic data type

기능 프로그래밍에서 일반화된 대수 데이터 유형(GADT, 또한 1종 팬텀 유형,[1] 보호되는 재귀 데이터 유형 [2]또는 동등 자격 유형[3])은 파라메트릭 대수 데이터 유형의 일반화다.

개요

GADT에서 제품 생성자(Haskell에서 데이터 생성자라고 함)는 수익가치의 유형 인스턴스화로서 ADT의 명시적 인스턴스화를 제공할 수 있다.이를 통해 보다 고급 유형 동작으로 함수를 정의할 수 있다.Haskell 2010의 데이터 생성자의 경우, 반환 값은 생성자의 애플리케이션에서 ADT 매개변수의 인스턴스화에 의해 암시되는 유형의 인스턴스화를 가진다.

- GADT가 아닌 파라메트릭 ADT 자료 리스트 a =    단점 a (리스트 a)  정수 = 단점 12 (단점 107 )       - 정수의 유형은 List Int이다. 줄들 = 단점 "보트" (단점 "dock" ) -- 문자열의 유형은 목록 문자열  ­ 갓트 자료 엑스퍼 a 어디에     에볼  ::      -> 엑스퍼      EInt   :: 인트      -> 엑스퍼 인트     EEqual :: 엑스퍼 인트 -> 엑스퍼 인트  -> 엑스퍼   평가하다 :: 엑스퍼 a -> a  평가하다 e = 케이스 e      에볼 a    -> a     EInt a     -> a     EEqual a b -> (평가하다 a) == (평가하다 b)  expr1 = EEqual (EInt 2) (EInt 3)        - expr1의 유형은 expr Bool이다. 되받아치다 = 평가하다 expr1                        -- ret is False 

그것들은 현재 GHC 컴파일러에서 다른 것들 중에서도 퍼그와 닥스가 사용하는 비표준 확장으로 구현되어 있다.OCaml은 버전 4.00부터 기본적으로 GADT를 지원한다.[4]

GHC 구현은 실존적으로 계량화된 형식 매개변수와 국소 제약에 대한 지원을 제공한다.

역사

일반화된 대수 데이터 유형의 초기 버전은 아우구스트손과 피터슨(1994)에 의해 설명되었고 ALF패턴 매칭에 기초하였다.

일반화된 대수 데이터 유형은 체니&힌제(2003)가 독자적으로 도입했고, 시 주석, 첸&첸(2003)이 ML하스켈대수 데이터 유형에 대한 확장으로 도입했다.[5]둘 다 본질적으로 서로 동등하다.이들은 Coq유도 구성 미적분학 및 기타 의존적으로 입력된 언어에서 발견되는 데이터 유형(또는 유도 데이터 유형)의 유도 계열과 유사하며, 종속 유형을 변조하고, 후자는 GADT에서 시행되지 않는 추가적인 긍정의 제한을 가지고 있다는 점을 제외한다.[6]

Sulzmann, Wazny &, Stuckey(2006년)을 소개했다 확장된 대수적 데이터 형식을 결합한 GADTs과 함께 실존적 데이터 형식과 유형 클래스 제약 조건 도입된 페리(1991년)harvtxt 오류:노 타깃:CITEREFPerry1991( 도와 주), Läufer &, Odersky(1994년)harvtxt 오류:노 타깃:CITEREFLäuferOdersky1994( 도와 주)과 Läufer(1996년)하.어rvtxt

프로그래머가 제공한 유형의 주석이 없는 경우 형식 추론확인되지[7] 않으며 GADT를 통해 정의된 함수는 일반적으로 주형을 인정하지 않는다.[8]형식 재구성은 몇 가지 설계 트레이드오프를 필요로 하며 활발한 연구 영역이다(Peyton Jones, Washburn & Weirich 2004; Peyton Jones et al. 2006; Pottier & Régis-Gianas 2006 ).( Sulzmann, Schrijvers & Stuckey 2006; Simonet & Pottier 2007 ( Schrijvers et et al. 2009; Lin & Sheard 2010a 오류: 없음: Lin & Sheard : 대상 없음:Vytiniotis, Peyton Jones & Schrijvers 2010 Vytiniotis et al. 2011 ).

2021년 봄에는 스칼라 3.0이 출시된다.[9]스칼라의 이번 주요 업데이트는 ADT와 동일한 구문으로 GADT를[10] 쓸 수 있는 가능성을 소개하는데, 마틴 오더스키에 따르면 다른 프로그래밍 언어에서는 그렇지 않다.[11]

적용들

GADT의 응용 프로그램에는 일반 프로그래밍, 모델링 프로그래밍 언어(고차 추상 구문), 데이터 구조에서 불변성 유지, 내장된 도메인 고유 언어의 제약 표현, 모델링 객체 등이 포함된다.[12]

고차 추상 구문

GADT의 중요한 적용은 고차 추상 구문안전한 유형으로 내장하는 것이다.여기에 기본 유형, 튜플고정결합기의 임의 컬렉션이 포함된 단순 타이핑 람다 미적분학:

자료  :: * -> * 어디에   들어올리다 :: a                     ->  a        -- ^ 상승된 값   짝을 ::  a ->  b        ->  (a, b)   -- ^ 제품     :: ( a ->  b)      ->  (a -> b) - ^ 람다 추상화   앱.  ::  (a -> b) ->  a ->  b        -- ^ 함수 적용   고치다  ::  (a -> a)          ->  a        -- ^ 고정점 

유형 안전 평가 기능:

평가하다 ::  t -> t 평가하다 (들어올리다 v)   = v 평가하다 (짝을 l r) = (평가하다 l, 평가하다 r) 평가하다 ( f)    = \x -> 평가하다 (f (들어올리다 x)) 평가하다 (앱. f x)  = (평가하다 f) (평가하다 x) 평가하다 (고치다 f)    = (평가하다 f) (평가하다 (고치다 f)) 

이제 요인 함수는 다음과 같이 기록할 수 있다.

사실의 = 고치다 ( (\f ->  (\y -> 들어올리다 (만일 평가하다 y == 0 그때 1 다른 평가하다 y * (평가하다 f) (평가하다 y - 1))))) 평가하다(사실의)(10) 

우리는 정규 대수 데이터 유형을 사용하는 문제에 부딪혔을 것이다.형식 매개 변수를 삭제하면 해제된 기본 유형이 실존적으로 수량화되어 평가자를 작성할 수 없게 되었을 것이다.형식 매개 변수로는 여전히 단일 기본 유형으로 제한될 수 있다.게다가 다음과 같은 잘못된 표현도 있다.App (Lam (\x -> Lam (\y -> App x y))) (Lift True)GADT를 사용하여 형식이 올바르지 않은 상태에서 구성할 수 있었을 것이다.잘 형성된 아날로그는App (Lam (\x -> Lam (\y -> App x y))) (Lift (\z -> True)). 의 유형이기 때문이다.x이다Lam (a -> b), 의 유형으로부터 유추했다.Lam데이터 생성자

참고 항목

메모들

  1. ^ 체니 & 힌제 2003.
  2. ^ Xi, Chen & Chen 2003.
  3. ^ 셰어드 & 파살릭 2004.
  4. ^ "OCaml 4.00.1". ocaml.org.
  5. ^ 체니 & 힌제 2003, 페이지 25.
  6. ^ 체니 & 힌즈 2003, 25-26페이지.
  7. ^ 페이튼 존스, 워시번 & 위리히 2004, 페이지 7.
  8. ^ 슈리히버스 외 연구진 2009년, 페이지 1.
  9. ^ Kmetiuk, Anatolii. "SCALA 3 IS HERE!🎉🎉🎉". scala-lang.org. École Polytechnique Fédérale Lausanne (EPFL) Lausanne, Switzerland. Retrieved 19 May 2021.
  10. ^ "SCALA 3 — BOOK ALGEBRAIC DATA TYPES". scala-lang.org. École Polytechnique Fédérale Lausanne (EPFL) Lausanne, Switzerland. Retrieved 19 May 2021.
  11. ^ Odersky, Martin. "A Tour of Scala 3 - Martin Odersky". youtube.com. Scala Days Conferences. Archived from the original on 2021-12-19. Retrieved 19 May 2021.
  12. ^ 페이튼 존스, 워시번 & 위리히 2004, 페이지 3.

추가 읽기

적용들
의미론
유형재구성
기타

외부 링크