순수 / 종속 형 시스템에 대한 간단하지만 완전한 설명은 무엇입니까?


32

무언가가 단순하다면 몇 마디로 완전히 설명 할 수 있어야합니다. 이것은 λ 미적분에 대해 수행 할 수 있습니다.

λ- 미적분은 축소 규칙 이있는 구문 문법 (기본적으로 구조)입니다 (이러한 패턴이 존재하지 않을 때까지 특정 패턴의 모든 발생에 반복적으로 검색 / 바꾸기 절차가 적용됨을 의미).

문법:

Term = (Term Term) | (λ Var . Term) | Var

축소 규칙 :

((λ var body) term) -> SUBS(body,var,term)
    where `SUBS` replaces all occurrences of `var`
    by `term` in `body`, avoiding name capture.

예 :

(λ a . a)                             -> (λ a a)
((λ a . (λ b . (b a))) (λ x . x))     -> (λ b . (b (λ x x)))
((λ a . (a a)) (λ x . x))             -> (λ x . x)
((λ a . (λ b . ((b a) a))) (λ x . x)) -> (λ b . ((b (λ x . x)) (λ x . x)))
((λ x . (x x)) (λ x . (x x)))         -> never halts

다소 비공식적이지만, 이것은 정상적인 인간이 λ- 미적분학을 전체적으로 이해하기에 충분히 유익하다고 주장 할 수 있으며 22 줄 의 마크 다운이 필요합니다. Idris / Agda 및 유사한 프로젝트에서 사용하는 순수 / 종속 형 시스템 을 이해하려고 노력하고 있지만, 내가 찾을 수있는 간단한 설명은 Simply Easy- 훌륭한 논문이지만, 이전의 많은 지식 (Haskell, 귀납적)을 가정 한 것으로 보입니다. 내가 정의하지 않은). 더 짧고 부자가 적 으면 그러한 장벽을 없앨 수 있다고 생각합니다. 그러므로,

위에서 λ- 미적분을 제시 한 것과 같은 형식으로 순수 / 종속 형 시스템에 대해 간단하고 완전하게 설명 할 수 있습니까?


4
Pure Type Systems의 규칙은 매우 간단합니다. Simply Easy는 종속 유형을 구현 하는 것입니다.

2
따라서 그것은 공격적인 의미에서 "적대적"이 아니지만, 스스로 대답을 찾기 위해 충분한 노력을 기울이지 않기 위해 많은 노력을 기울이고 있다고 생각합니까? 이 경우이 질문에 많은 요구가있을 수 있으므로 동의 할 수 있습니다. 그러나 그 뒤에 많은 노력이 있습니다. 내 시도에서 편집해야한다고 생각합니까?
MaiaVictor

3
나는 "의존적으로 람다 미적분의 튜토리얼 구현"이라는 글을 쓴 공동 저자들을 대신하여 불쾌감을 주었다. 나는 코드의 커널을 작성했다. 이것은 100 줄의 Haskell에서 타입 체커이다.

2
그때 나는 분명히 나 자신을 잘못 표현했다. 나는 "Simply Easy"논문을 좋아하고 며칠 전부터 모든 휴식 시간에 그것을 읽고 있습니다-그것은 내가 주제를 이해하기 시작한 부분적인 감각을 준 것은 세계에서 유일합니다. . 그러나 나는 그것이 내가 가진 것보다 더 많은 지식을 가진 대중을 목표로하고 있다고 생각하며, 이것이 여전히 참여에 어려움을 겪고있는 이유 일 수 있습니다. 종이의 품질과는 아무런 관련이 없지만 내 자신의 한계.
MaiaVictor

1
@ pigworker와 코드는 내가 가장 좋아하는 부분입니다. 왜냐하면 (영어 설명과 관련하여) 여기에 요청한 것처럼 전체에 대해 훨씬 짧지 만 완전하고 설명이 있기 때문입니다. 다운로드 할 수있는 코드 사본이 있습니까?
MaiaVictor

답변:


7

기권

요청 한대로 이것은 매우 비공식적입니다.

문법

의존적으로 유형이 지정된 언어에서는 값 수준뿐만 아니라 유형 수준에도 바인더가 있습니다.

Term = * | (∀ (Var : Term). Term) | (Term Term) | (λ Var. Term) | Var

잘 입력 기간이 부착 된 유형의 용어입니다, 우리가 쓸 것 t ∈ σ또는

σ
t

t에 유형이 있음을 나타냅니다 σ.

타이핑 규칙

단순하게하기 위해 우리의 그 요구 λ v. t ∈ ∀ (v : σ). τ를 모두 λ하고 (바인드 같은 변수 v이 경우에는).

규칙 :

t ∈ σ is well-formed if σ ∈ * and t is in normal form (0)

*            ∈ *                                                 (1)
∀ (v : σ). τ ∈ *             -: σ ∈ *, τ ∈ *                     (2)
λ v. t       ∈ ∀ (v : σ). τ  -: t ∈ τ                            (3)
f x          ∈ SUBS(τ, v, x) -: f ∈ ∀ (v : σ). τ, x ∈ σ          (4)
v            ∈ σ             -: v was introduced by ∀ (v : σ). τ (5)

따라서, *"모든 타입의 타입"(1)이며, 타입 2, 람다로부터 추상화 형태 유형 PI-유형 (3)를 가지고있는 경우 v에 의해 도입 ∀ (v : σ). τ후, v형태 갖는다 σ(도 5 참조).

"정상적인 형태"는 축소 규칙을 사용하여 가능한 한 많은 축소를 수행함을 의미합니다.

"감소 규칙"

(λ v. b ∈ ∀ (v : σ). τ) (t ∈ σ) ~> SUBS(b, v, t) ∈ SUBS(τ, v, t)
    where `SUBS` replaces all occurrences of `v`
    by `t` in `τ` and `b`, avoiding name capture.

또는 2 차원 구문에서

σ
t

의미 t ∈ σ:

(∀ (v : σ). τ) σ    SUBS(τ, v, t)
                 ~>
(λ  v     . b) t    SUBS(b, v, t)

항이 관련된 모든 수량 자에있는 변수와 유형이 같은 경우에만 항에 람다 추상화를 적용 할 수 있습니다. 그런 다음 순수한 람다 미적분학에서와 같은 방식으로 람다 추상화와 전체 정량자를 모두 줄입니다. 값 수준 부분을 빼면 (4) 입력 규칙을 얻습니다.

함수 응용 연산자는 다음과 같습니다.

∀ (A : *) (B : A -> *) (f : ∀ (y : A). B y) (x : A). B x
λ  A       B            f                    x     . f x

(우리는 축약 ∀ (x : σ). τσ -> τ경우 τ언급하지 않습니다 x)

fB y제공된 모든 y유형에 대해 반환 합니다 A. 우리는 적용 fx적합한 유형 인 A및 대체 y에 대한 x에서 .따라서 f x ∈ SUBS(B y, y, x)~> f x ∈ B x.

이제 함수 응용 프로그램 연산자를 약어로 사용 app하여 자체에 적용 해 보겠습니다 .

∀ (A : *) (B : A -> *). ?
λ  A       B          . app ? ? (app A B)

?우리가 제공해야 할 용어를 배치 합니다. 먼저 우리는 명시 적으로 소개하고 인스턴스화 AB:

∀ (f : ∀ (y : A). B y) (x : A). B x
app A B

이제 우리는 우리가 가진 것을 통합해야합니다

∀ (f : ∀ (y : A). B y) (x : A). B x

이것은 같은

(∀ (y : A). B y) -> ∀ (x : A). B x

무엇을 app ? ?받는가

∀ (x : A'). B' x

결과

A' ~ ∀ (y : A). B y
B' ~ λ _. ∀ (x : A). B x -- B' ignores its argument

( 우선 순위 란 무엇입니까? 참조 )

우리의 표현은 (일부 이름을 바꾼 후)

∀ (A : *) (B : A -> *). ?
λ  A       B          . app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B)

어떤 사람에 대한 A, Bf(여기서 f ∈ ∀ (y : A). B y)

∀ (y : A). B y
app A B f

우리는 인스턴스화 A하고 B얻을 수 있습니다 ( f적절한 유형의 모든 것에 대해 )

∀ (y : ∀ (x : A). B x). ∀ (x : A). B x
app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) f

형식 서명은와 같습니다 (∀ (x : A). B x) -> ∀ (x : A). B x.

전체 표현은

∀ (A : *) (B : A -> *). (∀ (x : A). B x) -> ∀ (x : A). B x
λ  A       B          . app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B)

∀ (A : *) (B : A -> *) (f : ∀ (x : A). B x) (x : A). B x
λ  A       B            f                    x     .
    app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B) f x

가치 수준에서 모든 감소 후에도 같은 결과를 가져 app옵니다.

그것을 얻기 위해 순수 람다 계산법에 몇 가지 단계가 필요합니다 그래서 상태 app에서 app app형식화 된 환경에서, 우리는 통일에 대해 신경 쓸 필요가 사물이 심지어 일부 일치하지 않게 편의 (더 복잡하게 (그리고 특히이 의존적으로 입력) * ∈ *).

타입 검사

  • 경우 t이며 *다음 t ∈ *(1)
  • 경우 t이다 ∀ (x : σ) τ, σ ∈? *, τ ∈? *(대한 참고 사항을 참조하십시오 ∈?아래를) 다음 t ∈ *(2)에 의해
  • 경우가 t있습니다 f x, f ∈ ∀ (v : σ) τ일부 σ하고 τ, x ∈? σ다음 t ∈ SUBS(τ, v, x)으로 (4)
  • 경우 t변수이고 v, v도입 된 ∀ (v : σ). τ다음 t ∈ σ으로 (5)

이것들은 모두 추론 규칙이지만 람다에 대해서도 똑같이 할 수는 없습니다 (종속 유추는 종속 유형에 대해 결정할 수 없습니다). 따라서 람다의 t ∈? σ경우 유추하기보다는 ( )를 확인합니다 .

  • 경우 t입니다 λ v. b및에 대해 검사 ∀ (v : σ) τ, b ∈? τ다음t ∈ ∀ (v : σ) τ
  • t다른 것이 있고 확인 된 경우 위의 기능 σt사용하는 유형을 추론하고 그것이 아닌지 확인하십시오σ

유형 검사 평등 그렇게 여부를 결정하기 위해, 정상적인 형태로 할 것을 요구 t입력이 σ우리에게 먼저 확인 σ유형이를 *. 그렇다면 σ정규화 가능 (modulo Girard의 역설)되고 정규화됩니다 (따라서 σ(0)으로 구성됩니다). SUBS또한 식을 정규화하여 (0)을 유지합니다.

이를 양방향 유형 확인이라고합니다. 그것으로 우리는 유형 모든 람다 주석을 달 필요가 없습니다에 경우 f x의 유형 f알려져 있으며, 다음 x인수의 유형에 대해 확인 f하는 대신 유추하고 (도 덜 효율적이다) 지 어떤지를 비교되는 받는다. 그러나 f람다 인 경우 명시 적 유형 주석이 필요합니다 (문법은 문법 및 모든 곳에서 생략되어 생성자를 추가 Ann Term Term하거나 추가 할 수 있음 λ' (σ : Term) (v : Var)).

또한 더 간단하고 쉬워 졌습니다 ! 블로그 게시물.


1
"간단하고 쉬워 진"두 번째.

forall의 첫 번째 축소 규칙은 이상하게 보입니다. 람다와 달리 forall은 올바른 형식으로 적용해서는 안됩니다 (오른쪽?).

@chi, 나는 당신이 말하는 것을 이해하지 못합니다. 아마도 내 표기법이 잘못되었을 수도 있습니다. 감소 규칙은 (λ v. b ∈ ∀ (v : σ). τ) (t ∈ σ)~> 라고 말합니다 SUBS(b, v, t) ∈ SUBS(τ, v, t).
user3237465

1
오해의 소지가 있습니다. 마치 두 가지 규칙이있는 것처럼 보입니다. 하나는 말도 안되고 (∀ (v : σ). τ) t ~> ...다른 하나는 의미있는 것 (λ v. b) t ~> ...입니다. 첫 번째를 제거하고 아래 주석으로 바꿉니다.

1
규칙 (1)은 전제로서 결론을 담고 있습니다. 작동하는 시스템이있는 경우에만 시스템의 단순성을 양방향 버전과 비교할 수 있습니다. 모든 것을 정규화한다고 말하지만 규칙은 그렇지 않습니다.

24

가자 나는 지라드의 역설에 대해 신경 쓰지 않을 것이다. 그것이 중심 아이디어에서 산만하기 때문이다. 판단과 도출 등에 관한 프레젠테이션 기계를 소개해야합니다.

문법

용어 :: = (엘림) | * | (Var : Term) → Term | λVar↦Term

엘림 :: = 학기 : 학기 | 바르 | 엘림 용어

문법에는 * (유형의 유형), 종속 함수 유형 및 람다-추정을 포함하여 사물의 일반적인 개념 (유형은 사물, 값은 사물) 인 "terms"라는 두 개의 상호 정의 된 형식이 있습니다. 제거 "(즉,"구조 "가 아닌"사용 ")는 궁극적으로 기능 위치에있는 것이 변수이거나 그 유형으로 주석이 달린 용어 인 중첩 된 응용 프로그램입니다.

축소 규칙

(λy↦t : (x : S) → T) s ↝ t [s : S / y] : T [s : S / x]

(t : T) ↝ t

대체 연산 t [e / x]는 이름 캡처를 피하면서 변수 x의 모든 발생을 제거 e로 대체합니다. 축소 할 수있는 응용 프로그램을 만들려면 람다 용어에 유형별로 주석을 달아 제거해야 합니다. 타입 주석은 람다-추상화에 일종의 "반응성"을 부여하여 애플리케이션을 계속 진행할 수 있도록합니다. 더 이상 응용 프로그램이 발생하지 않고 활성 t : T가 구문이라는 용어에 다시 포함되는 시점에 도달하면 유형 주석을 삭제할 수 있습니다.

구조적 폐쇄에 의해 ↝ 축소 관계를 확장하자 : 규칙은 왼쪽과 일치하는 것을 찾을 수있는 용어와 제거 내부에 적용됩니다. ↝의 반사성 전 이적 (0 단계 이상) 클로저에 대해 ↝ *라고 쓰십시오. 결과적인 감축 시스템은 이러한 의미에서 합류합니다

s ↝ * p 및 s ↝ * q이면 p ↝ * r 및 q ↝ * r과 같은 일부 r이 있습니다.

문맥

문맥 :: = | 문맥, Var : 용어

문맥은 변수에 유형을 할당하고 오른쪽에서 자라는 시퀀스로, "로컬"끝으로 생각하여 가장 최근에 바인딩 된 변수에 대해 알려줍니다. 컨텍스트의 중요한 속성은 컨텍스트에서 아직 사용되지 않은 변수를 항상 선택할 수 있다는 것입니다. 우리는 맥락에서 언급 된 변수가 다른 변수를 유지합니다.

판단

판단 :: = 맥락 ⊢ 용어에 용어가 있습니다 | 맥락 ⊢ 엘림은 용어

그것은 판단의 문법이지만 어떻게 읽는가? 시작을 위해, ⊢는 결론에서 가정을 분리하는 tradional "십자형 회전식 문"상징이다 : 당신은 그것을 "말"로 비공식적으로 읽을 수있다.

G ⊢ T는 t

문맥 G가 주어지면, 타입 T는 용어 t를 인정한다;

G ⊢ e는 S

주어진 문맥 G, 제거 e에 유형 S가 주어진다는 것을 의미한다.

판단에는 흥미로운 구조가 있습니다 : 0 개 이상의 입력 , 하나 이상의 주제 , 0 개 이상의 출력 .

INPUTS                   SUBJECT        OUTPUTS
Context |- Term   has    Term
Context |-               Elim      is   Term

즉, 사전에 용어 유형을 제안하고 확인 해야하지만 제거 유형을 종합 해야합니다.

타이핑 규칙

나는 이것들을 모호한 프롤로그 스타일로 제시하고 J-: P1; ...; Pn에서 Pn까지 Pn도 유지되면 판단 J가 보류됨을 표시합니다. 전제는 다른 판단 또는 축소에 대한 주장이 될 것입니다.

자귀

G⊢T는 t-: T↝R; G ⊢ R은 t

G ⊢ *는 *

G ⊢ *는 (x : S) → T-: G ⊢ *는 S를 가지며; G, z : S!-* T [z / x]

G ⊢ (x : S) → T는 λy↦t-: G, z : S ⊢ T [z / x]는 t [z / y]

G ⊢ T는 (e)-: G ⊢ e는 T

제거

G ⊢ e는 R-: G ⊢ e는 S이고; S ↝ R

G, x : S, G '⊢ x는 S

G⊢fs는 T [s : S / x]-: G⊢f는 (x : S) → T이고; G ⊢ S는 s

그리고 그게 다야!

구문 지향 이 아닌 두 가지 규칙 , 즉 "용어를 확인하기 전에 사용하기 전에 유형을 줄일 수 있습니다"라는 규칙과 "제거에서 유형을 합성 한 후 유형을 줄일 수 있습니다"라는 규칙이 있습니다. 실행 가능한 전략 중 하나는 최상위 생성자를 노출 할 때까지 유형을 줄이는 것입니다.

이 시스템은 (자기 참조의 역설적 인 역설 인 Girard의 역설 때문에) 강력하게 정규화되지는 않지만, 더 낮은 레벨의 유형과 관련된 값이있는 "유니버설 레벨"로 *를 분리하여 강력하게 정규화 할 수 있습니다. 더 높은 수준의 유형을 사용하여 자체 참조를 방지합니다.

그러나이 시스템은 이런 의미에서 보존 유형의 속성을 갖습니다.

G⊢T에 t가 있고 G G * D와 T and * R과 t↝r이면 D⊢R에는 r이있다.

G⊢e가 S이고 G↝ * D 및 e↝f이면, S↝ * R 및 D⊢f가 R이되도록 R이 존재한다.

컨텍스트는 포함 된 용어가 계산하도록 허용하여 계산할 수 있습니다. 즉, 지금 판단이 유효하면 원하는만큼 입력을 계산하고 한 단계 씩 주제를 계산할 수 있으며 결과로 판단 결과가 유효하게 유지되도록 출력을 계산할 수 있습니다. 증명은-> *의 합류점을 고려하여 타이핑 파생에 대한 간단한 유도입니다.

물론 여기서는 기능적 핵심 만 제시했지만 확장은 상당히 모듈화 될 수 있습니다. 여기 쌍이 있습니다.

용어 :: = ... | (x : S) * T | 성

엘림 :: = ... | e. 헤드 | e. 꼬리

(s, t : (x : S) * T). 머리 ↝ s : S

(s, t : (x : S) * T). 꼬리 ↝ t : T [s : S / x]

G ⊢ *는 (x : S) * T-: G ⊢ *는 S; G, z : S ⊢ *는 T [z / x]

G⊢ (x : S) * T는 s, t-: G GS는 s; G ⊢ T [s : S / x]는 t

G ⊢ e. 헤드는 S-: G ⊢ e는 (x : S) * T

G ⊢ e. 꼬리는 T [e.head / x]-: G ⊢ e는 (x : S) * T


1
G, x:S, G' ⊢ x is S -: G' ⊬ x?
user3237465

1
아니야. 감사! 결정된. (나는 HTML 십자형 회전식 문 (따라서 내 휴대 전화에서 그들에게 보이지 않게 함께 아스키 아트 십자형 회전식 문을 교체 할 때, 그의는) 다른 곳에서 일어나는 경우 죄송 나는 하나를 놓쳤다.)

1
오, 당신이 오타를 지적하고 있다고 생각했습니다. 규칙은 컨텍스트의 각 변수에 대해 컨텍스트가 할당하는 유형을 합성한다고 말합니다. 컨텍스트를 도입 할 때 "컨텍스트에 포함 된 변수가 고유하다는 불변성을 유지합니다." 그림자가 허용되지 않습니다. 규칙이 컨텍스트를 확장 할 때마다 항상 우리가 밟고있는 바인더를 인스턴스화하는 새로운 "z"를 선택한다는 것을 알 수 있습니다. 그림자는 혐오입니다. 컨텍스트 x : *, x : x가있는 경우 더 많은 로컬 x의 유형은 x가 범위를 벗어 났기 때문에 더 이상 유효하지 않습니다.

1
나는 방금 당신과 다른 응답자들이 내가 일에서 벗어날 때 마다이 스레드로 돌아오고 있음을 알기를 원했습니다. 나는 이것을 정말로 배우고 싶다. 그리고 첫번째 ime에 대해 나는 그것을 실제로 얻는 것처럼 떨어졌다. 다음 단계는 몇 가지 프로그램을 구현하고 작성하는 것입니다. 전 세계에서 저와 같은 훌륭한 주제에 관한 정보를 구할 수있는 시대에 살게되어 기쁩니다. 그 지식을 전파하기 위해 인생의 시간을 바친 여러분과 같은 천재 덕분입니다. 인터넷에서 무료로 제공됩니다. 내 질문을 심하게 표현해 주셔서 다시 한번 죄송합니다. 감사합니다.
MaiaVictor

1
@cody 예, 확장이 없습니다. 필요하지 않은 이유를 확인하려면 두 가지 계산 규칙을 ​​사용하여 항을 확인하기 전에 유형을 완전히 정규화하는 전략을 배포 할 수 있으며, 제거하지 않고 유형을 합성 한 직후에 유형을 정규화 할 수도 있습니다. 따라서 유형이 일치해야하는 규칙에서는 이미 정규화되었으므로 "원본"확인 및 합성 된 유형이 변환 가능한 경우 코와 동일합니다. 한편, 평등 검사를 그 장소로 제한하는 것은 다음과 같은 사실로만 가능합니다 .T가 표준 유형으로 변환 가능하면 표준 유형으로 감소합니다.
pigworker

8

Curry-Howard 서신은 유형 시스템증명 시스템 사이에 체계적인 대응 관계가 있다고 말합니다 . 프로그래머 중심의 관점에서 다음과 같이 다시 캐스팅 할 수 있습니다.

  • 논리적 증거 시스템은 프로그래밍 언어입니다.
  • 이 언어는 정적으로 입력됩니다.
  • 이러한 언어에서 유형 시스템의 책임은 건전한 증거를 구성하는 프로그램을 금지하는 것입니다.

이 각도에서 본 :

  • 요약 한 유형이 지정되지 않은 람다 미적분에는 중요한 유형 시스템이 없으므로이 시스템에 구축 된 증명 시스템이 적절하지 않습니다.
  • 간단하게 입력 된 람다 미적분학은 문장 논리 ( "if / then", "and", "or", "not")로 방음을 구축하는 데 필요한 모든 유형을 가진 프로그래밍 언어입니다. 그러나 그것의 타입은 정량화와 관련된 증거를 확인하기에 충분하지 않습니다 ( "모든 x, ..."; "x와 같은 ...가 있습니다").
  • 종속적으로 유형이 지정된 람다 미적분학에는 정서 논리 1 차 수량 화기 (값에 대한 수량화) 를 지원하는 유형 및 규칙이 있습니다 .

다음은 자연 공제에 대한 Wikipedia 항목 의 다이어그램을 사용하여 1 차 논리에 대한 자연 공제 규칙입니다 . 이것들은 기본적으로 최소한 종속적으로 유형이 지정된 람다 미적분학의 규칙입니다.

1 차 자연 공제

규칙에는 람다 용어가 있습니다. 이것들은 그들의 유형으로 표현 된 문장의 증거를 구성하는 프로그램으로 읽을 수 있습니다 (또는 간결하게 말하면, 우리는 단지 프로그램이 증거 라고 말합니다 ). 귀하가 제공하는 유사한 축소 규칙이 이러한 람다 용어에 적용될 수 있습니다.


왜 우리는 이것에 관심이 있습니까? 우선, 증명은 프로그래밍에 유용한 도구로 판명 될 수 있고, 일류 객체로서 증명과 함께 작동 할 수있는 언어를 갖는 것이 많은 길을 열어줍니다. 예를 들어, 함수에 전제 조건이있는 경우 주석으로 작성하는 대신 실제로이를 인수로 증명할 수 있습니다.

둘째, 정량자를 처리하는 데 필요한 유형 시스템 기계가 프로그래밍 컨텍스트에서 다른 용도로 사용될 수 있기 때문입니다. 특히 종속 형식화 된 언어는 종속 함수 형식 이라는 개념을 사용하여 범용 정량 자 ( "x, ...") 를 처리합니다. 결과 의 정적 형식 은 인수 의 런타임 값 에 의존 할 수 있는 함수입니다.

이를 매우 보행자에게 적용하기 위해 균일 한 구조의 레코드로 구성된 Avro 파일 을 읽어야하는 코드를 항상 작성합니다. 모두 동일한 필드 이름과 유형 집합을 공유합니다. 이를 위해서는 다음 중 하나가 필요합니다.

  1. 프로그램의 레코드 구조를 레코드 유형으로 하드 코드하십시오.
    • 장점 : 코드가 간단하고 컴파일러가 내 코드에서 오류를 잡을 수 있습니다.
    • 단점 : 프로그램이 레코드 유형에 맞는 파일을 읽도록 하드 코드되어 있습니다.
  2. 런타임시 데이터 스키마를 읽고 일반적으로 데이터 구조로 표시하고이를 사용하여 레코드를 일반적으로 처리하십시오.
    • 장점 : 내 프로그램은 하나의 파일 형식으로 만 하드 코딩되지 않습니다
    • 단점 : 컴파일러는 많은 오류를 포착 할 수 없습니다.

Avro Java 학습서 페이지 에서 볼 수 있듯이이 두 가지 접근 방식에 따라 라이브러리를 사용하는 방법을 보여줍니다.

종속 기능 유형을 사용하면 더 복잡한 유형의 시스템 비용으로 케이크를 먹고 먹을 수 있습니다. Avro 파일을 읽고 스키마를 추출하고 파일의 내용을 정적 유형이 파일에 저장된 스키마에 의존하는 레코드 스트림으로 리턴하는 함수를 작성할 수 있습니다 . 예를 들어 컴파일러는 런타임에 처리 할 파일의 레코드에 없을 수도있는 명명 된 필드에 액세스하려고 할 때 오류를 잡을 수 있습니다. 달콤 해?


1
언급 한 방식으로 런타임에 건물 유형은 내가 생각하지 않은 정말 멋진 것입니다. 오히려 달콤합니다! 통찰력있는 답변에 감사드립니다.
MaiaVictor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.