單值類型
在數理邏輯、計算機科學和類型論中,單值類型(unit type)是只允許1個值的數據類型。單值類型的基礎集(underlying set)是單元素集合。由於任何2個單元素集合同構,因而習慣稱「這個單值集合」( the unit type),不必考慮具體的值是什麼。也可以把單值類型視作0-元組,如無類型的積。
單值類型是範疇論中類型和有類型函數的終對象,不應與 zero或底類型混淆。後兩者允許no值,是範疇的始對象。類似的,布爾類型是有2個值的類型。
大多數函數式編程語言都實現了單值類型。一些指令式語言使用void類型,但其取值為空集,還是有所不同。
編程語言支持
- Haskell, Rust, Elm, 單值類型被稱作
()
,其僅有的值也寫作()
, 解釋為0元組。 - ML語言家族(包括OCaml, Standard ML, F#), 單值類型被稱作
unit
,但其值寫作()
. - Scala語言中,單值類型稱作
Unit
,其值寫作()
. - 在Common Lisp中,單值類型名字是NULL,其取值為NIL。不要與類型NIL混淆,該類型是底類型。
- Python中的類型
NoneType
,僅有的取值為None
. - Swift中單值類型是
Void
或()
,其值寫作()
- Java語言中單值類型為
Void
,其值寫作null
. - Go語言中單值類型為
struct{}
,其值寫作struct{}{}
. - PHP中單值類型為null,其值寫作NULL
- JavaScript中,類型
Null
(取值為null
)和類型Undefined
(取值為undefined
)都是原生單值類型 - Kotlin中單值類型為
Unit
,其值為Unit
對象 - Ruby中單值類型為
NilClass
,其值寫作nil
- C++17中單值類型為
std::monostate
。更早版本可自定義空結構struct empty{}
.
Void類型用作單值類型
C語言, C++, C#, D, void
用於指示函數不返回任何有用結果,或函數無參數。C語言中的單值類型在概念上類似於空struct
,但C語言不允許無成員的結構(C++允許)。
真正的單值類型與void類型的使用區別,可以參見下例:
void f(void) {}
void g(void) {}
int main(void)
{
f(g()); // compile-time error here
return 0;
}
C++允許空類作為單值類型:
class unit_type {};
const unit_type the_unit;
unit_type f(unit_type) { return the_unit; }
unit_type g(unit_type) { return the_unit; }
int main()
{
f(g(the_unit));
return 0;
}
void類型不用占存儲。但單值類型在結構或類中是占一定空間存儲的。