Unit type
   HOME

TheInfoList



OR:

In the area of
mathematical logic Mathematical logic is the study of Logic#Formal logic, formal logic within mathematics. Major subareas include model theory, proof theory, set theory, and recursion theory (also known as computability theory). Research in mathematical logic com ...
and
computer science Computer science is the study of computation, information, and automation. Computer science spans Theoretical computer science, theoretical disciplines (such as algorithms, theory of computation, and information theory) to Applied science, ...
known as
type theory In mathematics and theoretical computer science, a type theory is the formal presentation of a specific type system. Type theory is the academic study of type systems. Some type theories serve as alternatives to set theory as a foundation of ...
, a unit type is a type that allows only one value (and thus can hold no information). The carrier (underlying set) associated with a unit type can be any singleton set. There is an isomorphism between any two such sets, so it is customary to talk about ''the'' unit type and ignore the details of its value. One may also regard the unit type as the type of 0- tuples, i.e. the product of no types. The unit type is the terminal object in the category of types and typed functions. It should not be confused with the ''zero'' or empty type, which allows ''no'' values and is the initial object in this category. Similarly, the Boolean is the type with ''two'' values. The unit type is implemented in most
functional programming In computer science, functional programming is a programming paradigm where programs are constructed by Function application, applying and Function composition (computer science), composing Function (computer science), functions. It is a declarat ...
languages. The void type that is used in some imperative programming languages serves some of its functions, but because its carrier set is empty, it has some limitations (as detailed below).


In programming languages

Several computer
programming language A programming language is a system of notation for writing computer programs. Programming languages are described in terms of their Syntax (programming languages), syntax (form) and semantics (computer science), semantics (meaning), usually def ...
s provide a unit type to specify the result type of a function with the sole purpose of causing a
side effect In medicine, a side effect is an effect of the use of a medicinal drug or other treatment, usually adverse but sometimes beneficial, that is unintended. Herbal and traditional medicines also have side effects. A drug or procedure usually use ...
, and the argument type of a function that does not require arguments. *In Haskell, Rust, and Elm, the unit type is called () and its only value is also (), reflecting the 0-tuple interpretation. *In ML descendants (including OCaml, Standard ML, and F#), the type is called unit but the value is written as (). *In Scala, the unit type is called Unit and its only value is written as (). *In Common Lisp the type named is a unit type which has one value, namely the symbol . This should not be confused with the ''type'', which is the bottom type. * In Python, there is a type called NoneType which allows the single value of None. In Python's optional static type annotations, this type is represented as None. * In Swift, the unit type is called Void or () and its only value is also (), reflecting the 0-tuple interpretation. * In
Java Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
, the unit type is called Void and its only value is null. * In Go, the unit type is written struct and its value is struct. * In PHP, the unit type is called null, which only value is NULL itself. * In
JavaScript JavaScript (), often abbreviated as JS, is a programming language and core technology of the World Wide Web, alongside HTML and CSS. Ninety-nine percent of websites use JavaScript on the client side for webpage behavior. Web browsers have ...
, both Null (its only value is null) and Undefined (its only value is undefined) are built-in unit types. * in Kotlin, Unit is a singleton with only one value: the Unit object. * In Ruby, nil is the only instance of the NilClass class. * In C++, the std::monostate unit type was added in C++17. Before that, it is possible to define a custom unit type using an empty struct such as struct empty. * In Dart, both Null and the empty record ((), since Dart 3) have a single possible value, respectively, null and ().


Void type as unit type

In C, C++, C#, D, and PHP, void is used to designate a function that does not return anything useful, or a function that accepts no arguments. The unit type in C is conceptually similar to an empty struct, but a struct without members is not allowed in the C language specification (this is allowed in C++). Instead, 'void' is used in a manner that simulates some, but not all, of the properties of the unit type, as detailed below. Like most imperative languages, C allows functions that do not return a value; these are specified as having the void return type. Such functions are called procedures in other imperative languages like Pascal, where a syntactic distinction, instead of type-system distinction, is made between functions and procedures.


Difference in calling convention

The first notable difference between a true unit type and the void type is that the unit type may always be the type of the argument to a function, but the void type cannot be the type of an argument in C, despite the fact that it may appear as the sole argument in the list. This problem is best illustrated by the following program, which is a compile-time error in C: void f(void) void g(void) int main(void) This issue does not arise in most programming practice in C, because since the void type carries no information, it is useless to pass it anyway; but it may arise in generic programming, such as C++ templates, where void must be treated differently from other types. In C++ however, empty classes are allowed, so it is possible to implement a real unit type; the above example becomes compilable as: class unit_type ; const unit_type the_unit; unit_type f(unit_type) unit_type g(unit_type) int main() (For brevity, we're not worried in the above example whether the_unit is really a singleton; see singleton pattern for details on that issue.)


Difference in storage

The second notable difference is that the void type is special and can never be stored in a record type, i.e. in a struct or a class in C/C++. In contrast, the unit type can be stored in records in functional programming languages, i.e. it can appear as the type of a field; the above implementation of the unit type in C++ can also be stored. While this may seem a useless feature, it does allow one for instance to elegantly implement a set as a map to the unit type; in the absence of a unit type, one can still implement a set this way by storing some dummy value of another type for each key.


In Generics

In Java Generics, type parameters must be reference types. The wrapper type Void is often used when a unit type parameter is needed. Although the Void type can never have any instances, it does have one value, null (like all other reference types), so it acts as a unit type. In practice, any other non-instantiable type, e.g. Math, can also be used for this purpose, since they also have exactly one value, null. public static Void f(Void x) public static Void g(Void x) public static void main(String[] args)


Null type

Statically typed languages give a type to every possible expression. They need to associate a type to the null expression. A type will be defined for null and it will only have this value. For example in D, it's possible to declare functions that may only return null: typeof(null) returnThatSpecialThing() null is the only value that typeof(null), a unit type, can have.


See also

* Singleton pattern (where a particular class has only one instance, but narrowly-typed non-nullable references to it are usually not held by other classes)


Notes


References

* * {{Data types Data types Type theory Articles with example Java code