The Standard ML Basis Library is a collection of modules dealing with basic types, input/output, OS interfaces, and simple datatypes. It is intended as a portable library usable across all implementations of SML. For the official online version of the Basis Library specification, see https://smlfamily.github.io/Basis. The Standard ML Basis Library is a book version that includes all of the online version and more. For a reverse chronological list of changes to the specification, see https://smlfamily.github.io/Basis/history.html.
MLton implements all of the required portions of the Basis Library. MLton also implements many of the optional structures. In the future, MLton will also implement proposed improvements to the Basis Library.
You can obtain a complete and current list of what’s available using
mlton -show-basis
(see ShowBasis). By default, MLton makes the
Basis Library available to user programs. You can also
access the Basis Library from
ML Basis files.
MLton purposefully hides the representation of unspecified Basis Library types with opaque signature matching. That is, unless the Basis Library specifies that a structure’s type is equal to some other type, the type will be opaque and will not be seen as equal to any type but itself.
Below is a complete list of what MLton implements.
Top-level types and constructors
eqtype 'a array
datatype bool = false | true
eqtype char
type exn
eqtype int
datatype 'a list = nil | :: of ('a * 'a list)
datatype 'a option = NONE | SOME of 'a
datatype order = EQUAL | GREATER | LESS
type real
datatype 'a ref = ref of 'a
eqtype string
type substring
eqtype unit
eqtype 'a vector
eqtype word
Top-level exception constructors
Bind
Chr
Div
Domain
Empty
Fail of string
Match
Option
Overflow
Size
Span
Subscript
Top-level values
MLton does not implement the optional top-level value
use: string -> unit
, which conflicts with whole-program
compilation because it allows new code to be loaded dynamically.
MLton implements all other top-level values:
!
,
:=
,
<>
,
=
,
@
,
^
,
app
,
before
,
ceil
,
chr
,
concat
,
exnMessage
,
exnName
,
explode
,
floor
,
foldl
,
foldr
,
getOpt
,
hd
,
ignore
,
implode
,
isSome
,
length
,
map
,
not
,
null
,
o
,
ord
,
print
,
real
,
rev
,
round
,
size
,
str
,
substring
,
tl
,
trunc
,
valOf
,
vector
Overloaded identifiers
*
,
+
,
-
,
/
,
<
,
⇐
,
>
,
>=
,
~
,
abs
,
div
,
mod
Top-level signatures
ARRAY
ARRAY2
ARRAY_SLICE
BIN_IO
BIT_FLAGS
BOOL
BYTE
CHAR
COMMAND_LINE
DATE
GENERAL
GENERIC_SOCK
IEEE_REAL
IMPERATIVE_IO
INET_SOCK
INTEGER
INT_INF
IO
LIST
LIST_PAIR
MATH
MONO_ARRAY
MONO_ARRAY2
MONO_ARRAY_SLICE
MONO_VECTOR
MONO_VECTOR_SLICE
NET_HOST_DB
NET_PROT_DB
NET_SERV_DB
OPTION
OS
OS_FILE_SYS
OS_IO
OS_PATH
OS_PROCESS
PACK_REAL
PACK_WORD
POSIX
POSIX_ERROR
POSIX_FILE_SYS
POSIX_IO
POSIX_PROCESS
POSIX_PROC_ENV
POSIX_SIGNAL
POSIX_SYS_DB
POSIX_TTY
PRIM_IO
REAL
SOCKET
STREAM_IO
STRING
STRING_CVT
SUBSTRING
TEXT
TEXT_IO
TEXT_STREAM_IO
TIME
TIMER
UNIX
UNIX_SOCK
VECTOR
VECTOR_SLICE
WORD
Top-level structures
structure Array: ARRAY
structure Array2: ARRAY2
structure ArraySlice: ARRAY_SLICE
structure BinIO: BIN_IO
structure BinPrimIO: PRIM_IO
structure Bool: BOOL
structure BoolArray: MONO_ARRAY
structure BoolArray2: MONO_ARRAY2
structure BoolArraySlice: MONO_ARRAY_SLICE
structure BoolVector: MONO_VECTOR
structure BoolVectorSlice: MONO_VECTOR_SLICE
structure Byte: BYTE
structure Char: CHAR
-
Char
characters correspond to ISO-8859-1. TheChar
functions do not depend on locale.
structure CharArray: MONO_ARRAY
structure CharArray2: MONO_ARRAY2
structure CharArraySlice: MONO_ARRAY_SLICE
structure CharVector: MONO_VECTOR
structure CharVectorSlice: MONO_VECTOR_SLICE
structure CommandLine: COMMAND_LINE
structure Date: DATE
-
Date.fromString
andDate.scan
accept a space in addition to a zero for the first character of the day of the month. The Basis Library specification only allows a zero.
structure FixedInt: INTEGER
structure General: GENERAL
structure GenericSock: GENERIC_SOCK
structure IEEEReal: IEEE_REAL
structure INetSock: INET_SOCK
structure IO: IO
structure Int: INTEGER
structure Int1: INTEGER
structure Int2: INTEGER
structure Int3: INTEGER
structure Int4: INTEGER
…
structure Int31: INTEGER
structure Int32: INTEGER
structure Int64: INTEGER
structure IntArray: MONO_ARRAY
structure IntArray2: MONO_ARRAY2
structure IntArraySlice: MONO_ARRAY_SLICE
structure IntVector: MONO_VECTOR
structure IntVectorSlice: MONO_VECTOR_SLICE
structure Int8: INTEGER
structure Int8Array: MONO_ARRAY
structure Int8Array2: MONO_ARRAY2
structure Int8ArraySlice: MONO_ARRAY_SLICE
structure Int8Vector: MONO_VECTOR
structure Int8VectorSlice: MONO_VECTOR_SLICE
structure Int16: INTEGER
structure Int16Array: MONO_ARRAY
structure Int16Array2: MONO_ARRAY2
structure Int16ArraySlice: MONO_ARRAY_SLICE
structure Int16Vector: MONO_VECTOR
structure Int16VectorSlice: MONO_VECTOR_SLICE
structure Int32: INTEGER
structure Int32Array: MONO_ARRAY
structure Int32Array2: MONO_ARRAY2
structure Int32ArraySlice: MONO_ARRAY_SLICE
structure Int32Vector: MONO_VECTOR
structure Int32VectorSlice: MONO_VECTOR_SLICE
structure Int64Array: MONO_ARRAY
structure Int64Array2: MONO_ARRAY2
structure Int64ArraySlice: MONO_ARRAY_SLICE
structure Int64Vector: MONO_VECTOR
structure Int64VectorSlice: MONO_VECTOR_SLICE
structure IntInf: INT_INF
structure LargeInt: INTEGER
structure LargeIntArray: MONO_ARRAY
structure LargeIntArray2: MONO_ARRAY2
structure LargeIntArraySlice: MONO_ARRAY_SLICE
structure LargeIntVector: MONO_VECTOR
structure LargeIntVectorSlice: MONO_VECTOR_SLICE
structure LargeReal: REAL
structure LargeRealArray: MONO_ARRAY
structure LargeRealArray2: MONO_ARRAY2
structure LargeRealArraySlice: MONO_ARRAY_SLICE
structure LargeRealVector: MONO_VECTOR
structure LargeRealVectorSlice: MONO_VECTOR_SLICE
structure LargeWord: WORD
structure LargeWordArray: MONO_ARRAY
structure LargeWordArray2: MONO_ARRAY2
structure LargeWordArraySlice: MONO_ARRAY_SLICE
structure LargeWordVector: MONO_VECTOR
structure LargeWordVectorSlice: MONO_VECTOR_SLICE
structure List: LIST
structure ListPair: LIST_PAIR
structure Math: MATH
structure NetHostDB: NET_HOST_DB
structure NetProtDB: NET_PROT_DB
structure NetServDB: NET_SERV_DB
structure OS: OS
structure Option: OPTION
structure PackReal32Big: PACK_REAL
structure PackReal32Little: PACK_REAL
structure PackReal64Big: PACK_REAL
structure PackReal64Little: PACK_REAL
structure PackRealBig: PACK_REAL
structure PackRealLittle: PACK_REAL
structure PackWord16Big: PACK_WORD
structure PackWord16Little: PACK_WORD
structure PackWord32Big: PACK_WORD
structure PackWord32Little: PACK_WORD
structure PackWord64Big: PACK_WORD
structure PackWord64Little: PACK_WORD
structure Position: INTEGER
structure Posix: POSIX
structure Real: REAL
structure RealArray: MONO_ARRAY
structure RealArray2: MONO_ARRAY2
structure RealArraySlice: MONO_ARRAY_SLICE
structure RealVector: MONO_VECTOR
structure RealVectorSlice: MONO_VECTOR_SLICE
structure Real32: REAL
structure Real32Array: MONO_ARRAY
structure Real32Array2: MONO_ARRAY2
structure Real32ArraySlice: MONO_ARRAY_SLICE
structure Real32Vector: MONO_VECTOR
structure Real32VectorSlice: MONO_VECTOR_SLICE
structure Real64: REAL
structure Real64Array: MONO_ARRAY
structure Real64Array2: MONO_ARRAY2
structure Real64ArraySlice: MONO_ARRAY_SLICE
structure Real64Vector: MONO_VECTOR
structure Real64VectorSlice: MONO_VECTOR_SLICE
structure Socket: SOCKET
-
The Basis Library specification requires functions like
Socket.sendVec
to raise an exception if they fail. However, on some platforms, sending to a socket that hasn’t yet been connected causes aSIGPIPE
signal, which invokes the default signal handler forSIGPIPE
and causes the program to terminate. If you want the exception to be raised, you can ignoreSIGPIPE
by adding the following to your program.let open MLton.Signal in setHandler (Posix.Signal.pipe, Handler.ignore) end
structure String: STRING
-
The
String
functions do not depend on locale.
structure StringCvt: STRING_CVT
structure Substring: SUBSTRING
structure SysWord: WORD
structure Text: TEXT
structure TextIO: TEXT_IO
structure TextPrimIO: PRIM_IO
structure Time: TIME
structure Timer: TIMER
structure Unix: UNIX
structure UnixSock: UNIX_SOCK
structure Vector: VECTOR
structure VectorSlice: VECTOR_SLICE
structure Word: WORD
structure Word1: WORD
structure Word2: WORD
structure Word3: WORD
structure Word4: WORD
…
structure Word31: WORD
structure Word32: WORD
structure Word64: WORD
structure WordArray: MONO_ARRAY
structure WordArray2: MONO_ARRAY2
structure WordArraySlice: MONO_ARRAY_SLICE
structure WordVectorSlice: MONO_VECTOR_SLICE
structure WordVector: MONO_VECTOR
structure Word8Array: MONO_ARRAY
structure Word8Array2: MONO_ARRAY2
structure Word8ArraySlice: MONO_ARRAY_SLICE
structure Word8Vector: MONO_VECTOR
structure Word8VectorSlice: MONO_VECTOR_SLICE
structure Word16Array: MONO_ARRAY
structure Word16Array2: MONO_ARRAY2
structure Word16ArraySlice: MONO_ARRAY_SLICE
structure Word16Vector: MONO_VECTOR
structure Word16VectorSlice: MONO_VECTOR_SLICE
structure Word32Array: MONO_ARRAY
structure Word32Array2: MONO_ARRAY2
structure Word32ArraySlice: MONO_ARRAY_SLICE
structure Word32Vector: MONO_VECTOR
structure Word32VectorSlice: MONO_VECTOR_SLICE
structure Word64Array: MONO_ARRAY
structure Word64Array2: MONO_ARRAY2
structure Word64ArraySlice: MONO_ARRAY_SLICE
structure Word64Vector: MONO_VECTOR
structure Word64VectorSlice: MONO_VECTOR_SLICE
Top-level functors
ImperativeIO
PrimIO
StreamIO
-
MLton’s
StreamIO
functor takes structuresArraySlice
andVectorSlice
in addition to the arguments specified in the Basis Library specification.
Type equivalences
The following types are equivalent.
FixedInt = Int64.int LargeInt = IntInf.int LargeReal.real = Real64.real LargeWord = Word64.word
The default int
, real
, and word
types may be set by the
-default-type type
compile-time option.
By default, the following types are equivalent:
int = Int.int = Int32.int real = Real.real = Real64.real word = Word.word = Word32.word
Real and Math functions
The Real
, Real32
, and Real64
modules are implemented
using the C
math library, so the SML functions will reflect the
behavior of the underlying library function. We have made some effort
to unify the differences between the math libraries on different
platforms, and in particular to handle exceptional cases according to
the Basis Library specification. However, there will be differences
due to different numerical algorithms and cases we may have missed.
Please submit a bug report if you encounter an error in
the handling of an exceptional case.
On x86, real arithmetic is implemented internally using 80 bits of
precision. Using higher precision for intermediate results in
computations can lead to different results than if all the computation
is done at 32 or 64 bits. If you require strict IEEE compliance, you
can compile with -ieee-fp true
, which will cause intermediate
results to be stored after each operation. This may cause a
substantial performance penalty.