일등 시민으로서의 유형


10

C ++ 배경에서 온 이유는 왜 일급 시민으로서 유형 / 유형 표현이 필요한지 이해하지 못합니까? 이 기능을 지원하는 유일한 언어는 Aldor입니다.

누구든지 일급 시민으로서 유형에 관한 문헌이 있거나 그것이 유용한 이유를 알고 있습니까?


3
이드리스 도 이것들을 가지고 있습니다.
ThreeFx

1
"type is a value"(다양한 언어에서 "반사"또는 "메타 클래스"라고 함)의 일반적인 개념이나보다 구체적인 유형 표현 개념에 대해 질문하고 있습니까?
svick

1
@svick 나는 후자에 관심이 있습니다. 불행히도 형식 표현에 대한 일반적인 내용을 많이 찾지 못했기 때문에 문헌을 제안 할 수 있다면 좋을 것입니다.
paul98

답변:


11

퍼스트 클래스 타입은 의존적 타이핑 이라는 것을 가능하게합니다 . 이를 통해 프로그래머는 유형 레벨에서 유형 값을 사용할 수 있습니다. 예를 들어, 모든 정수 쌍의 유형은 일반 유형이고, 왼쪽 숫자가 오른쪽 숫자보다 작은 모든 정수 쌍은 종속 유형입니다. 이것의 표준 소개 예제는 길이로 인코딩 된 목록입니다 (일반적으로 VectorHaskell / Idris에서 호출 ). 다음 의사 코드는 Idris와 Haskell의 혼합물입니다.

-- a natural number
data Nat = Zero | Successor Nat

data Vector length typ where
  Empty : Vector Zero typ
  (::)   : typ -> Vector length typ -> Vector (Successor length) typ

이 코드는 두 가지를 알려줍니다.

  • 빈 목록의 길이는 0입니다.
  • cons요소를 목록에 추가하면 길이 목록이 작성됩니다. n + 1

이것은 0을 가진 다른 개념과 매우 유사 해 n + 1보이지 않습니까? 다시 돌아 올게요.

우리는 이것으로부터 무엇을 얻습니까? 이제 우리가 사용하는 기능의 추가 속성을 결정할 수 있습니다. 예를 들어 :의 중요한 속성은 append결과 목록의 길이가 두 인수 목록의 길이의 합이라는 것입니다.

plus : Nat -> Nat -> Nat
plus          Zero n = n
plus (Successor m) n = Successor (plus m n)

append : Vector n a -> Vector m a -> Vector (plus n m) a
append Empty  ys = ys
append (x::xs) ys = x :: append xs ys

그러나이 모든 기술이 일상적인 프로그래밍에 모두 유용한 것은 아닙니다. 어떻게 이런 일이 소켓에 관련이 있습니까 POST/ GET등등 요청과?

글쎄요 (적어도 노력하지 않으면 안됩니다). 그러나 다른 방법으로 우리를 도울 수 있습니다.

종속 유형을 사용하면 함수의 동작 방식에 따라 코드의 규칙을 변형으로 공식화 할 수 있습니다. 이를 사용하여 Eiffel의 사전 및 사후 조건과 유사하게 코드의 동작에 대한 추가 안전성을 얻습니다. 이것은 자동 정리 증명에 매우 유용하며, 이는 Idris의 가능한 용도 중 하나입니다.

위의 예로 돌아가서, 길이 인코딩 된리스트의 정의는 수학적 개념의 유도 와 유사합니다 . Idris에서는 실제로 다음과 같은 목록에서 유도 개념을 공식화 할 수 있습니다.

              -- If you can supply the following:
list_induction : (Property : Vector len typ -> Type) -> -- a property to show
                  (Property Empty) -> -- the base case
                  ((w : a) -> (v : Vector n a) ->
                      Property v -> Property (w :: v)) -> -- the inductive step
                  (u : Vector m b) -> -- an arbitrary vector
                  Property u -- the property holds for all vectors

이 기술은 건설적인 증거로 제한되지만 그럼에도 불구하고 매우 강력합니다. append연습으로 귀납적으로 쓸 수 있습니다 .

물론 종속 유형은 첫 번째 클래스 유형을 한 번만 사용하지만 가장 일반적인 유형 중 하나입니다. 추가 용도에는 예를 들어 인수를 기반으로 함수에서 특정 유형을 반환하는 것이 포함됩니다.

type_func : Vector n a -> Type
type_func Empty = Nat
type_func v     = Vector (Successor Zero) Nat

f : (v : Vector n a) -> type_func v
f Empty = 0
f vs    = length vs :: Empty

이것은 무의미한 예이지만 일급 유형이 없으면 에뮬레이션 할 수없는 것을 보여줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.