태그 보관물: data-types

data-types

유형 이론의 올바른 용어 : 유형, 유형 생성자, 종류 / 정렬 및 값 constructor, type

에 대한 답변에서 이전 질문 , 작은 논쟁이 특정 구조에 대한 정확한 용어에 대한 시작했다. 나는 (이외의 질문을 찾을 수 없습니다로 또는 명확하게이 문제를 해결하기 위해 매우 옳은 일 아니다),이 새로운 일을하고 있습니다.

의심스러운 용어와 그 관계는 type, type constructor, type 매개 변수, 종류 또는 정렬 및 값 입니다.

나는 또한 wikipedia 에 유형 이론이 있는지 확인 했지만 그 사실을 분명히하지 못했습니다.

따라서 좋은 참조 답변을 얻고 내 자신의 이해를 확인하기 위해 :

  • 이러한 것들이 어떻게 제대로 정의되어 있습니까?
  • 이들 각각의 차이점은 무엇입니까?
  • 그들은 서로 어떻게 관련되어 있습니까?


답변

자, 하나씩합시다.

가치

가치는 프로그램이 평가하고 저글링하는 구체적인 데이터입니다. 공상이 아님, 몇 가지 예는

  • 1
  • true
  • "fizz buzz foo bar"

종류

유형에 대한 좋은 설명은 “값 분류기”입니다. 유형은 런타임에 해당 값이 무엇인지에 대한 약간의 정보이지만 컴파일 타임에 표시됩니다.

예를 들어, 당신은 나에게 그렇게 말한다면 e : bool컴파일시에, 나는 그 알 e중 하나입니다 true또는 false런타임시, 아무것도! 타입은 이런 식으로 값을 잘 분류하기 때문에이 정보를 사용하여 프로그램의 기본 속성을 결정할 수 있습니다.

예를 들어, 내가 지금까지 당신이 추가를 참조하는 경우 ee'e : inte' : String나는 뭔가 비트 꺼져 알고있다! 사실 나는 이것을 플래그 지정하고 컴파일 타임에 오류를 던질 수 있습니다. “이봐, 전혀 말이되지 않습니다!”.

더 강력한 유형 시스템은 더 흥미로운 값을 분류하는 더 흥미로운 유형을 허용합니다. 예를 들어, 어떤 기능을 고려해 봅시다

f = fun x -> x

꽤 분명 f : Something -> Something하지만 그게 뭐야 Something? 지루한 유형의 시스템에서와 같이 임의의 것을 지정해야합니다 Something = int. 보다 유연한 유형 시스템에서는 다음과 같이 말할 수 있습니다.

f : forall a. a -> a

즉 “어떤을 위해 말을하는 것입니다 a, f매핑 aa“. 이를 통해 f보다 일반적으로 사용 하고 더 흥미로운 프로그램을 작성해 보겠습니다 .

또한 컴파일러는 우리가 부여한 분류자를 실제로 만족하는지 검사 f = fun x -> true할 것입니다. 버그가 있으면 컴파일러가 그렇게 말할 것입니다!

tldr로; 형식은식이 런타임에있을 수있는 값에 대한 컴파일 시간 제약 조건입니다.

타입 생성자

일부 유형이 관련되어 있습니다. 예를 들어 정수 목록은 문자열 목록과 매우 유사합니다. 이것은 sort정수의 sort경우 문자열의 경우 와 거의 같습니다 . 우리는 차이점을 일반화하고 요구에 따라 구축함으로써 거의 동일한 유형을 구축하는 일종의 공장을 상상할 수 있습니다. 이것이 타입 생성자입니다. 유형에서 유형에 이르는 함수와 비슷하지만 조금 더 제한적입니다.

전형적인 예는 일반적인 목록입니다. 의 형식 생성자는 일반적인 정의 일뿐입니다.

 data List a = Cons a (List a) | Nil

이제 List유형 a을 해당 유형의 값 목록에 매핑하는 함수입니다 ! Java-land에서는 아마도 이것이 “일반 클래스”라고 생각합니다

유형 매개 변수

형식 매개 변수는 형식 생성자 (또는 함수)에 전달 된 형식입니다. 그냥 우리가 말하고 싶지만 값 레벨과 같은 foo(a)매개 변수가 a얼마나 같은 List a유형의 매개 변수가 있습니다을 a.

종류

종류는 조금 까다 롭습니다. 기본 개념은 특정 유형이 유사하다는 것입니다. 예를 들어, 우리는 모든 원시 타입 자바가 int, char, float…하는 모든 행동하라가 동일한 “유형”을 가지고있는 것처럼. 유형 자체에 대한 분류 자에 대해 말할 때를 제외하고는 분류자를 종류라고합니다. 그래서 int : Prim, String : Box, List : Boxed -> Boxed.

이 시스템은 유형이 값을 관리하는 방식과 같이 어디서 사용할 수있는 유형에 대한 구체적인 규칙을 제공합니다. 분명히 말이되지 않습니다

 List<List>

또는

 List<int>

Java에서는 List콘크리트 유형에 적용해야하므로 그렇게 사용할 수 있습니다! 우리가 그들의 종류를 보면 List : Boxed -> Boxed이후부터는 Boxed -> Boxed /= Boxed위의 오류입니다!

대부분의 경우 우리는 실제로 종류에 대해 생각하지 않고 “상식”으로 취급하지만 더 멋진 유형 시스템에서는 생각해야 할 중요한 것입니다.

내가 지금까지 말한 것에 대한 작은 그림

 value   : type : kind  : ...
 true    : bool : Prim  : ...
 new F() : Foo  : Boxed : ...

위키 백과보다 더 나은 독서

이런 종류의 것에 관심이 있다면 좋은 교과서를 투자하는 것이 좋습니다. 타입 이론과 PLT는 일반적으로 상당히 광범위하며 일관된 지식 기반이 없으면 몇 달 동안 아무데도 가지 않고 돌아 다닐 수 있습니다.

내가 가장 좋아하는 책 중 두 가지는

  • 타입과 프로그래밍 언어-Ben Pierce
  • 프로그래밍 언어의 실제 기초-Bob Harper

둘 다 제가 방금 이야기 한 내용을 아름답고 잘 설명 된 세부 사항으로 소개하는 훌륭한 책입니다.


답변

이러한 것들이 어떻게 제대로 정의되어 있습니까?

그것들은 견고하고 학문적 인 수학 지원에 의해 올바르게 정의되어 있으며, 현재의 상태, 작동 방식 및 보장되는 것에 대해 강력한 주장을 제공합니다.

그러나 프로그래머는이를 알 필요가 없습니다. 그들은 개념을 이해해야합니다.

가치

모든 것이 거기에서 만들어지기 때문에 가치부터 시작합시다. 값은 컴퓨팅에 사용되는 데이터입니다. 접근 방식에 따라 42, 3.14, “지금은 갈색 암소”, 회계 담당자 Jenny의 직원 기록 등 모두에게 친숙한 가치입니다.

값의 다른 해석은 기호 입니다. 대부분의 프로그래머는 이러한 기호를 열거의 “값”으로 이해합니다. Left그리고 Right열거 형의 상징입니다 Handedness(양 손잡이를 피하는 사람과 물고기를 무시하십시오).

구현에 관계없이 값은 언어가 계산을 수행하기 위해 사용하는 다른 작업입니다.

종류

값의 문제점은 모든 계산이 모든 값에 대해 합법적이지는 않다는 것입니다. 42 + goat실제로 이해가되지 않습니다.

이것은 유형이 작용하는 곳입니다. 유형은 값의 하위 집합을 정의하는 메타 데이터입니다. Handedness위 의 열거 형이 좋은 예입니다. 이 유형은 말한다 “만 Left하고 Right여기에 이용 될 수 있습니다.” 이를 통해 프로그램은 특정 작업에서 오류가 발생한다는 것을 조기에 파악할 수 있습니다.

고려해야 할 또 다른 실용적인 용도는 컴퓨터가 바이트 단위로 작동한다는 것입니다. 바이트 42는 숫자 42를 의미하거나 * 문자를 의미하거나 Accounting의 Jenny를 의미 할 수 있습니다. 유형은 (이론적으로는 실용적이지 않지만) 컴퓨터에서 사용하는 기본 바이트 컬렉션에 대한 인코딩을 정의하는 데 도움이됩니다.

종류

그리고 여기 우리가 조금 나가기 시작하는 곳이 있습니다. 따라서 프로그래밍 언어에 유형을 나타내는 변수가 있으면 어떤 유형 이 있습니까?

예를 들어 Java 및 C #에서는 유형이 있습니다 Type( 유형 이 있고 유형 Type이 … 등). 이것은 종류 뒤에 개념 입니다. 일부 언어에서는 Java 및 C #보다 Type 변수를 사용하여 좀 더 유용한 작업을 수행 할 수 있습니다. 그런 일이 발생하면 “유형 인 값을 원하지만 어떤 종류 의 값이기도합니다”라고 말하는 것이 유용합니다 IEnumerable<int>. 타다! 종류.

대부분의 프로그래머는 Java 및 C # 일반 제약 조건과 같은 종류를 생각할 수 있습니다. 고려하십시오 public class Foo<T> where T: IComparable{}. 종류가있는 언어에서는 T: kindOf(IComparable)변수 선언이 합법화됩니다. 클래스와 함수 선언에서 할 수있는 특별한 일이 아닙니다.

타입 생성자

놀랍게도 타입 생성자는 단순히 types의 생성자 일 것입니다 . “하지만 유형을 어떻게 구성합니까? 유형은 단지 입니다 .” 어 …별로.

또한 의심 할 여지 없이 컴퓨터 프로그램이 사용할 다른 유용한 값의 하위 집합을 모두 만드는 것은 매우 어렵습니다 . 타입 생성자는 프로그래머가 의미있는 방식으로 서브셋을 “빌드”할 수 있도록 도와줍니다.

형식 생성자의 가장 보편적 인 예는 배열 정의 int[4]입니다. 여기 4에서는 값을 사용하여 int4 개의 항목 이있는의 배열을 작성하는 유형 생성자를 지정 합니다. 다른 입력 유형을 지정한 경우 다른 출력 유형이 표시됩니다.

제네릭은 다른 형식의 형식 생성자이며 다른 형식을 입력으로 사용합니다.

많은 언어에는 type P -> R을 가져 P오고 type을 반환 하는 함수를 나타내는 형식을 작성하는 것과 같은 형식 생성자가 R있습니다.

이제 컨텍스트는 “유형을 리턴하는 함수”가 유형 생성자인지 여부를 판별합니다. 필자의 제한된 경험에서 “컴파일 타임에이 유형을 사용할 수 있습니까?”라는 문구가 있습니다. 예? 타입 생성자. 아니? 그냥 기능입니다.

유형 매개 변수

그래서 타입 생성자에 전달 된 매개 변수를 기억하십니까? 형식 생성자의 일반적인 형식은 Type[param]또는 이므로 일반적으로 형식 매개 변수라고 Type<param>합니다.


답변