Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
Ad hoc polymorphism
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{Short description|Applying polymorphic functions to arguments of different types}} {{Polymorphism}} In [[programming languages]], '''ad hoc polymorphism'''<ref>C. Strachey, [http://www.ics.uci.edu/~jajones/INF102-S18/readings/05_stratchey_1967.pdf Fundamental concepts in programming languages]. Lecture notes for International Summer School in Computer Programming, Copenhagen, August 1967</ref> is a kind of [[polymorphism (computer science)|polymorphism]] in which polymorphic functions can be applied to arguments of different types, because a polymorphic function can denote a number of distinct and potentially heterogeneous implementations depending on the type of argument(s) to which it is applied. When applied to [[object-oriented]] or procedural concepts, it is also known as [[function overloading]] or [[operator overloading]]. The term [[ad hoc]] in this context is not intended to be pejorative; it refers simply to the fact that this type of polymorphism is not a fundamental feature of the [[type system]]. This is in contrast to [[parametric polymorphism]], in which polymorphic functions are written without mention of any specific type, and can thus apply a single abstract implementation to any number of types in a transparent way. This classification was introduced by [[Christopher Strachey]] in 1967. ==Early binding== Ad hoc polymorphism is a [[dynamic dispatch|dispatch]] mechanism: control moving through one named function is dispatched to various other functions without having to specify the exact function being called. Overloading allows multiple functions taking different types to be defined with the same name; the [[compiler]] or [[interpreter (computing)|interpreter]] automatically ensures that the right function is called. This way, functions appending lists of [[integer]]s, lists of [[string (computer science)|string]]s, lists of [[real number]]s, and so on could be written, and all be called ''append''—and the right ''append'' function would be called based on the type of lists being appended. This differs from parametric polymorphism, in which the function would need to be written ''generically'', to work with any kind of list. Using overloading, it is possible to have a function perform two completely different things based on the type of input passed to it; this is not possible with parametric polymorphism (but would have to be achieved with switching on the type inside the generic function). Another way to look at overloading is that a routine is uniquely identified not by its name, but by the combination of its name and the number, order and types of its parameters. This type of polymorphism is common in [[object-oriented programming]] languages, many of which allow [[operator (programming)|operator]]s to be overloaded in a manner similar to functions (see [[operator overloading]]). Some languages that are not dynamically typed and lack ad hoc polymorphism (including type classes) have longer function names such as <code>print_int</code>, <code>print_string</code>, etc. This can be seen as advantage (more descriptive) or a disadvantage (overly verbose) depending on one's point of view. An advantage that is sometimes gained from overloading is the appearance of specialization, e.g., a function with the same name can be implemented in multiple different ways, each optimized for the particular data types that it operates on. This can provide a convenient interface for code that needs to be specialized to multiple situations for performance reasons. The downside is that the type system cannot guarantee the consistency of the different implementations. Since overloading is done at compile time, it is not a substitute for [[late binding]] as found in [[subtyping polymorphism]]. ==Late binding== The previous section notwithstanding, there are other ways in which ''ad hoc'' polymorphism can work out. Consider for example the Smalltalk language. In [[Smalltalk]], the overloading is done at run time, as the methods ("function implementation") for each overloaded message ("overloaded function") are resolved when they are about to be executed. This happens at run time, after the program is compiled. Therefore, polymorphism is given by [[subtyping polymorphism]] as in other languages, and it is also extended in functionality by ''ad hoc'' polymorphism at run time. A closer look will also reveal that Smalltalk provides a slightly different variety of ''ad hoc'' polymorphism. Since Smalltalk has a late bound execution model, and since it provides objects the ability to handle messages that are not understood, it is possible to implement functionality using polymorphism without explicitly overloading a particular message. This may not be generally recommended practice for everyday programming, but it can be quite useful when implementing proxies. Also, while in general terms common class method and constructor overloading is not considered polymorphism, there are more uniform languages in which classes are regular objects. In Smalltalk, for instance, classes are regular objects. In turn, this means messages sent to classes can be overloaded, and it is also possible to create objects that behave like classes without their classes inheriting from the hierarchy of classes. These are effective techniques that can be used to take advantage of Smalltalk's powerful [[reflection (computer science)|reflection]] capabilities. Similar arrangements are also possible in languages such as [[Self (programming language)|Self]] and [[Newspeak (programming language)|Newspeak]]. ==Example== Imagine an operator <code>+</code> that may be used in the following ways: # <code>1 + 2 = 3</code> # <code>3.14 + 0.0015 = 3.1415</code> # <code>1 + 3.7 = 4.7</code> # <code>[1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]</code> # <code>[true, false] + [false, true] = [true, false, false, true]</code> # <code>"bab" + "oon" = "baboon"</code> To handle these six function calls, four different pieces of code are needed (or three, if strings are considered to be lists of characters): * In the first case, [[integer (computer science)|integer]] addition must be invoked. * In the second and third cases, [[floating point|floating-point]] addition must be invoked (with [[type promotion]], or [[type coercion]], in the third case). * In the fourth and fifth cases, [[List (computing)|list]] [[concatenation]] must be invoked. * In the last case, [[literal string|string]] concatenation must be invoked. Thus, the name <code>+</code> actually refers to three or four completely different functions. This is an example of ''[[Overloading (programming)|overloading]]'' or more specifically, ''[[operator overloading]]''. Note the ambiguity in the string types used in the last case. Consider <code>"123" + "456"</code> in which the programmer might ''naturally'' assume addition rather than concatenation. They may expect <code>"579"</code> instead of <code>"123456"</code>. Overloading can therefore provide different meaning, or semantics, for an operation, as well as differing implementations. == See also == * [[Operator overloading]] * [[Type class]] * [[Polymorphism (computer science)]] (other kinds of polymorphism) * [[Parametric polymorphism]] ==References== {{reflist}} <!--Categories--> [[Category:Polymorphism (computer science)]] [[Category:Programming language topics]] [[Category:Type theory]]
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)
Pages transcluded onto the current version of this page
(
help
)
:
Template:Polymorphism
(
edit
)
Template:Reflist
(
edit
)
Template:Short description
(
edit
)