단위형
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의 단위 유형