单值类型

在数理逻辑、计算机科学和类型论中，单值类型（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中，单值类型名字是，其取值为。不要与类型混淆，该类型是。
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类型不用占存储。但单值类型在结构或类中是占一定空间存储的。

参见
 单例模式

参考文献



Category:D数据类型
Category:类型论