单值类型

数理逻辑计算机科学类型论中,单值类型(unit type)是只允许1个值的数据类型。单值类型的基础集(underlying set)是单元素集合。由于任何2个单元素集合同构,因而习惯称“这个单值集合”( the unit type),不必考虑具体的值是什么。也可以把单值类型视作0-元组,如无类型的

单值类型是范畴论中类型和有类型函数的终对象,不应与 zero底类型英语bottom type混淆。后两者允许no值,是范畴的始对象。类似的,布尔类型是有2个值的类型。

大多数函数式编程语言都实现了单值类型。一些指令式语言使用void类型,但其取值为空集,还是有所不同。

编程语言支持

  • Haskell, Rust, Elm, 单值类型被称作(),其仅有的值也写作(), 解释为0元组。
  • ML语言家族(包括OCaml, Standard ML, F#), 单值类型被称作unit,但其值写作().
  • Scala语言中,单值类型称作Unit,其值写作().
  • Common Lisp中,单值类型名字是NULL,其取值为NIL。不要与类型NIL混淆,该类型是底类型英语bottom type
  • 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类型不用占存储。但单值类型在结构或类中是占一定空间存储的。

参见

  • 单例模式

参考文献

  • Pierce, Benjamin C. Types and Programming Languages. MIT Press. 2002: 118–119. ISBN 0-262-16209-1. 
  • nLabunit type条目