C ++ 배경에서 온 이유는 왜 일급 시민으로서 유형 / 유형 표현이 필요한지 이해하지 못합니까? 이 기능을 지원하는 유일한 언어는 Aldor입니다.
누구든지 일급 시민으로서 유형에 관한 문헌이 있거나 그것이 유용한 이유를 알고 있습니까?
C ++ 배경에서 온 이유는 왜 일급 시민으로서 유형 / 유형 표현이 필요한지 이해하지 못합니까? 이 기능을 지원하는 유일한 언어는 Aldor입니다.
누구든지 일급 시민으로서 유형에 관한 문헌이 있거나 그것이 유용한 이유를 알고 있습니까?
답변:
퍼스트 클래스 타입은 의존적 타이핑 이라는 것을 가능하게합니다 . 이를 통해 프로그래머는 유형 레벨에서 유형 값을 사용할 수 있습니다. 예를 들어, 모든 정수 쌍의 유형은 일반 유형이고, 왼쪽 숫자가 오른쪽 숫자보다 작은 모든 정수 쌍은 종속 유형입니다. 이것의 표준 소개 예제는 길이로 인코딩 된 목록입니다 (일반적으로 Vector
Haskell / 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
이 코드는 두 가지를 알려줍니다.
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
이것은 무의미한 예이지만 일급 유형이 없으면 에뮬레이션 할 수없는 것을 보여줍니다.