일반 대수 데이터 유형

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.

추가 읽기

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

외부 링크