单值类型
外观
在数理逻辑、计算机科学和类型论中,单值类型(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类型不用占存储。但单值类型在结构或类中是占一定空间存储的。