Product type
Page Module:Message box/ambox.css has no content.
This article includes a list of general references, but it lacks sufficient corresponding inline citations. (October 2020) |
In programming languages and type theory, a product of types is another, compounded, type in a structure. The "operands" of the product are types, and the structure of a product type is determined by the fixed order of the operands in the product. An instance of a product type retains the fixed order, but otherwise may contain all possible instances of its primitive data types. The expression of an instance of a product type will be a tuple, and is called a "tuple type" of expression. A product of types is a direct product of two or more types.
If there are only two component types, it can be called a "pair type". For example, if two component types and are the set of all possible values of that type, the product type written contains elements that are pairs , where and are instances of and respectively. The pair type is a special case of the dependent pair type, where the type may depend on the instance picked from .
In many languages, product types take the form of a record type, for which the components of a tuple can be accessed by label. In languages that have algebraic data types, as in most functional programming languages, algebraic data types with one constructor are isomorphic to a product type.
In the Curry–Howard correspondence, product types are associated with logical conjunction (Page Template:Mono/styles.css has no content.AND) in logic.
The notion directly extends to the product of an arbitrary finite number of types (an -ary product type), and in this case, it characterizes the expressions that behave as tuples of expressions of the corresponding types. A degenerate form of product type is the unit type: it is the product of no types.
In call-by-value programming languages, a product type can be interpreted as a set of pairs whose first component is a value in the first type and whose second component is a value in the second type. In short, it is a cartesian product and it corresponds to a product in the category of types.
Most functional programming languages have a primitive notion of product type. For instance, the product is written T1 * T2 * ... * Tn in ML and (T1, T2, ..., Tn) in Haskell. In both these languages, tuples are written (v1, v2, ..., vn) and the components of a tuple are extracted by pattern-matching. Additionally, many functional programming languages provide more general algebraic data types, which extend both product and sum types. Product types are the dual of sum types.
Product types in programming languages
- C++ defines the class
std::tuple(expressedtuple<Ts...>using variadic templates),[1] and for the specific case of two elements definesstd::pair(expressedpair<T, U>).[2]std::tuplecan be empty (tuple<>). - C#/.NET Framework defines the class
System.Tuple. There are specific instantiations for 1 to 8 elements. For the specific case of two elements (a pair), it usesTuple<T1, T2>.[3] In order to create a tuple with nine or more components, the final parameterTRestofTuple<T1, T2, T3, T4, T5, T6, T7, TRest>is supplied as another tuple.[4] For iterating over collections like dictionary types, the classSystem.Collections.Generic.KeyValuePair(expressedKeyValuePair<TKey, TValue>) is provided.[5] - Go does not have a tuple type, but can express multiple return values in a function as a sort of tuple.[6]
- Haskell has a data type
Data.Tuple.[7] - Java does not have a general tuple type, but JavaFX has a type
javafx.util.Pair(expressedPair<K, V>).[8] For iterating over associative containers such asjava.util.Map, a pair in the map is expressed asMap.Entry<K, V>.[9] - Kotlin does not have a general tuple type, but has classes
kotlin.Pair(expressedPair<A, B>)[10] andkotlin.Triple(expressedTriple<A, B, C>).[11] - Python has a
tuplecollection which can be annotated astyping.Tuple(expressedTuple[T1, T2, ..., TN]).[12] - Rust defines the primitive tuple type, expressed as
(T1, T2, ..., TN), and a pair is just(T, U).[13] - Scala defines the class
scala.Tuple,[14] which supports between 2 and 22 objects asscala.Tuple2(expressed asTuple2[A, B])[15] toscala.Tuple22(expressed asTuple22[A, B, ..., V]).[16] - Swift expresses tuples as
(T1, T2, ..., TN).[17]
See also
- Product (category theory)
- Cartesian product
- Record (computer science)
- Struct (C programming language)
- Sum type
- Quotient type
References
- Template:Nlab
- Homotopy Type Theory: Univalent Foundations of Mathematics, The Univalent Foundations Program, Institute for Advanced Study. See section 1.5.
Page Template:Reflist/styles.css has no content.
- ^ Page Module:Citation/CS1/styles.css has no content."std::tuple". cppreference.com. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."std::pair". cppreference.com. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Tuple Class". learn.microsoft.com. Microsoft Learn. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> Class". learn.microsoft.com. Microsoft Learn. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."KeyValuePair<TKey, TValue> struct". learn.microsoft.com. Microsoft Learn. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Effective Go - Functions - Multiple return values". go.dev. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Data.Tuple". hackage.haskell.org. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Class Pair<K, V>". download.java.net. Oracle Corporation. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Interface Map.Entry<K, V>". docs.oracle.com. Oracle Corporation. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Pair". kotlinlang.org. JetBrains s.r.o. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Triple". kotlinlang.org. JetBrains s.r.o. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."5. Data Structures". docs.python.org. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."tuple - Rust". doc.rust-lang.org. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Tuple". www.scala-lang.org. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Tuple2". www.scala-lang.org. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Tuple22". www.scala-lang.org. Retrieved 14 October 2025.
- ^ Page Module:Citation/CS1/styles.css has no content."Types Documentation". docs.swift.org. Apple Inc. Retrieved 14 October 2025.
Lua error in package.lua at line 80: module 'Module:Navbox/configuration' not found.