Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / src / Overloading.adoc
CommitLineData
7f918cf1
CE
1Overloading
2===========
3
4In <:StandardML:Standard ML>, constants (like `13`, `0w13`, `13.0`)
5are overloaded, meaning that they can denote a constant of the
6appropriate type as determined by context. SML defines the
7overloading classes _Int_, _Real_, and _Word_, which denote the sets
8of types that integer, real, and word constants may take on. In
9MLton, these are defined as follows.
10
11[cols="^25%,<75%"]
12|=====
13| _Int_ | `Int2.int`, `Int3.int`, ... `Int32.int`, `Int64.int`, `Int.int`, `IntInf.int`, `LargeInt.int`, `FixedInt.int`, `Position.int`
14| _Real_ | `Real32.real`, `Real64.real`, `Real.real`, `LargeReal.real`
15| _Word_ | `Word2.word`, `Word3.word`, ... `Word32.word`, `Word64.word`, `Word.word`, `LargeWord.word`, `SysWord.word`
16|=====
17
18The <:DefinitionOfStandardML:Definition> allows flexibility in how
19much context is used to resolve overloading. It says that the context
20is _no larger than the smallest enclosing structure-level
21declaration_, but that _an implementation may require that a smaller
22context determines the type_. MLton uses the largest possible context
23allowed by SML in resolving overloading. If the type of a constant is
24not determined by context, then it takes on a default type. In MLton,
25these are defined as follows.
26
27[cols="^25%,<75%"]
28|=====
29| _Int_ | `Int.int`
30| _Real_ | `Real.real`
31| _Word_ | `Word.word`
32|=====
33
34Other implementations may use a smaller context or different default
35types.
36
37== Also see ==
38
39 * http://www.standardml.org/Basis/top-level-chapter.html[discussion of overloading in the Basis Library]
40
41== Examples ==
42
43 * The following program is rejected.
44+
45[source,sml]
46----
47structure S:
48 sig
49 val x: Word8.word
50 end =
51 struct
52 val x = 0w0
53 end
54----
55+
56The smallest enclosing structure declaration for `0w0` is
57`val x = 0w0`. Hence, `0w0` receives the default type for words,
58which is `Word.word`.