단위형

Unit type

유형 이론으로 알려진 수학 논리학컴퓨터 과학 분야에서 단위 유형은 하나의 값만 허용하는 유형이다(따라서 어떤 정보도 보유할 수 없다). 장치 유형과 관련된 캐리어(아래 세트)는 모든 싱글톤 세트가 될 수 있다. 그런 두 집합 사이에는 어떤 이형성(異形性)이 있기 때문에 단위 유형에 대해 이야기하고 그 가치의 세부적인 내용은 무시하는 것이 관례다. 또한 장치 유형을 0-tuple의 유형, 즉 무유형의 제품으로 간주할 수 있다.

단위형은 종류와 형식함수의 범주에 있는 단자 객체다. 값을 허용하지 않으며 이 범주의 초기 개체인 0또는하단 유형과 혼동해서는안 된다. 마찬가지로 부울은 두 의 값을 가진 유형이다.

단위 유형은 대부분의 기능 프로그래밍 언어로 구현된다. 일부 필수 프로그래밍 언어에 사용되는 보이드 타입은 그 기능 중 일부를 제공하지만, 그것의 통신사 세트가 비어 있기 때문에, 그것은 몇 가지 한계(아래에 자세히 설명되어 있음)를 가지고 있다.

프로그래밍 언어에서

몇몇 컴퓨터 프로그래밍 언어부작용을 유발하는 유일한 목적을 가진 함수의 결과 유형과 인수가 필요 없는 함수의 인수 유형을 지정하는 단위 유형을 제공한다.

  • 하스켈, 러스트, 엘름에서는 단위 타입을 부른다. () 그리고 그것의 유일한 가치는 또한 ()0-tuple 해석을 반영한다.
  • ML 하위(OCaml, Standard ML, F# 포함)에서는 유형을 호출한다. unit 그러나 그 가치는 다음과 같이 기록되어 있다. ().
  • 스칼라에서는 단위 유형을 호출한다. Unit 그리고 그것의 유일한 가치는 다음과 같다. ().
  • Common Lisp에서 명명된 유형은 하나의 값, 즉 기호를 갖는 단위 유형이다. 이것은 하단 타입인 타입과 혼동해서는 안 된다.
  • Python에는, 라고 불리는 타입이 있다. NoneType 이 단 하나의 가치를 허용한다 None.
  • Swift에서는 단위 타입을 호출한다. Void , 또는 () 그리고 그것의 유일한 가치는 또한 ()0-tuple 해석을 반영한다.
  • Java에서는 단위 유형을 호출한다. Void 그리고 그것의 유일한 가치는 null.
  • Go에 단위 유형이 기록됨 struct{} 그리고 그 가치는 struct{}{}.
  • PHP에서는 단위 유형을 NULL이라고 하는데, 값만 NULL 그 자체다.
  • JavaScript에서는 두 가지 모두 Null (그것의 유일한 가치는 null) 및 Undefined (그것의 유일한 가치는 undefined)은 내장된 단위 유형이다.
  • 코틀린에서 Unit 단 하나의 값을 갖는 싱글톤: Unit 이의를 제기하다
  • 루비에서는 nil 의 유일한 예다. NilClass 계급의
  • C++에서는 std::monostate C++17에 단위 유형이 추가되었다. 그 전에 다음과 같은 빈 구조를 사용하여 사용자 정의 단위 유형을 정의할 수 있다. struct empty{}.

단위 유형으로서의 보이드 유형

C, C++, C#, D에서 void 유용한 것을 반환하지 않는 함수 또는 인수를 받아들이지 않는 함수를 지정하는 데 사용된다. C의 단위 유형은 개념적으로 빈 단위와 유사하다. struct, 그러나 멤버가 없는 구조체는 C 언어 규격에서 허용되지 않는다(C++에서 허용된다). 그 대신 'void'는 다음과 같이 장치 유형의 속성의 일부(전부는 아님)를 시뮬레이션하는 방식으로 사용된다. 대부분의 필수 언어와 마찬가지로, C는 값을 반환하지 않는 기능을 허용한다; 이것들은 무효 반환 형식을 갖는 것으로 지정된다. 그러한 기능을 파스칼과 같은 다른 필수 언어에서는 절차라고 부르는데, 여기서 형식 체계 구분이 아니라 통사적 구분이 기능과 절차 사이에서 이루어진다.

통화 규칙의 차이

참 단위 유형과 보이드 유형의 첫 번째 주목할 만한 차이는 단위 유형이 항상 함수에 대한 인수의 유형일 수 있지만, 리스트에 유일한 인수로 나타날 수 있음에도 불구하고 보이드 유형은 C에서 인수의 유형이 될 수 없다는 것이다. 이 문제는 C의 컴파일 시간 오류인 다음 프로그램으로 가장 잘 설명된다.

공허하게 하다 f(공허하게 하다) {} 공허하게 하다 g(공허하게 하다) {}  인트로 본래의(공허하게 하다) {   f(g()); // 여기에서 컴파일 시간 오류   돌아오다 0; } 

이 문제는 C의 대부분의 프로그래밍 연습에서는 발생하지 않는데, 왜냐하면 다음부터입니다. void 형식은 정보를 가지고 있지 않고, 어쨌든 그것을 통과시키는 것은 쓸모없다; 그러나 그것은 C++ 템플릿같은 일반적인 프로그래밍에서 발생할 수 있다. void 다른 유형과 다르게 취급되어야 한다. 그러나 C++에서는 빈 클래스가 허용되므로 실제 장치 유형을 구현할 수 있다. 위의 예는 다음과 같이 보완될 수 있다.

계급의 unit_type {}; 경시하다 unit_type the_unit;  unit_type f(unit_type) { 돌아오다 the_unit; } unit_type g(unit_type) { 돌아오다 the_unit; }  인트로 본래의() {   f(g(the_unit));   돌아오다 0; } 

(단순함을 위해, 위의 예에서 우리는 걱정하지 않는다. the_unit 실제로 싱글톤이다. 자세한 내용은 싱글톤 패턴을 참조하십시오.)

저장량차이

두 번째로 주목할 만한 차이점은 보이드 형식이 특별하고 기록 유형, 즉 C/C++의 구조체나 클래스에 절대 저장할 수 없다는 점이다. 이와는 대조적으로, 단위 유형은 기능 프로그래밍 언어의 레코드에 저장될 수 있다. 즉, 필드의 유형으로 나타날 수 있다. C++에서 단위 유형의 위의 구현도 저장할 수 있다. 이것이 쓸모없는 특징으로 보일 수도 있지만, 예를 들어, 한 사람이 단위 유형에 대한 지도로서 세트를 우아하게 구현할 수 있다; 단위 유형이 없는 경우에도, 각 키에 대해 다른 유형의 어떤 더미 값을 저장함으로써 이러한 방식으로 세트를 구현할 수 있다.

In Generics

Java 제네릭스에서 형식 매개 변수는 참조 유형이어야 한다. 래퍼 유형 Void 단위 유형 매개변수가 필요할 때 자주 사용된다. 비록 Void 유형은 어떤 인스턴스도 가질 수 없고, 하나의 가치를 가지고 있다. null (다른 모든 참조 유형과 마찬가지로) 단위 유형으로 작용한다. 실무에서, 예를 들어, 다른 비인기적 유형. Math, 또한 이러한 목적을 위해 사용될 수 있다. 왜냐하면 그것들은 또한 정확히 하나의 가치를 가지고 있기 때문이다. null.

공중의 정태의 보이드 f(보이드 x) { 돌아오다 무효의; } 공중의 정태의 보이드 g(보이드 x) { 돌아오다 무효의; }  공중의 정태의 공허하게 하다 본래의([] 아그) {     f(g(무효의)); } 

참고 항목

  • 싱글톤 패턴(특정 클래스에 인스턴스가 하나만 있지만 좁게 타이핑된 Nullable 참조는 일반적으로 다른 클래스가 보유하지 않는 경우)

참조

  • Pierce, Benjamin C. (2002). Types and Programming Languages. MIT Press. pp. 118–119. ISBN 0-262-16209-1.
  • nLab단위 유형