From 0d016cdce1c688335dc265056137890d7a7850c9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?=
- Because lists are commonly used, they have shorthand type notations.
+ Because lists are commonly used, they have shorthand type notations.
The types
Notice that the shorthand for
@@ -184,8 +184,8 @@
The notation
- For convenience, the following types are also built-in. - They can be thought as predefined aliases for the type unions also shown in + For convenience, the following types are also built-in. + They can be thought as predefined aliases for the type unions also shown in the table.
Users are not allowed to define types with the same names as the predefined or built-in ones. This is checked by the compiler and - its violation results in a compilation error. + its violation results in a compilation error.
@@ -394,13 +394,13 @@
-record(rec, {field1 :: Type1, field2, field3 :: Type3}).
- For fields without type annotations, their type defaults to any(). + For fields without type annotations, their type defaults to any(). That is, the previous example is a shorthand for the following:
-record(rec, {field1 :: Type1, field2 :: any(), field3 :: Type3}).
- In the presence of initial values for fields, + In the presence of initial values for fields, the type must be declared after the initialization, as follows:
@@ -409,12 +409,12 @@ The initial values for fields are to be compatible with (that is, a member of) the corresponding types. This is checked by the compiler and results in a compilation error - if a violation is detected. + if a violation is detected.Before Erlang/OTP 19, for fields without initial values, the singleton type
'undefined' was added to all declared types. - In other words, the following two record declarations had identical + In other words, the following two record declarations had identical effects:-record(rec, {f1 = 42 :: integer(), @@ -430,22 +430,22 @@- Any record, containing type information or not, once defined, + Any record, containing type information or not, once defined, can be used as a type using the following syntax:
#rec{}- In addition, the record fields can be further specified when using + In addition, the record fields can be further specified when using a record type by adding type information about the field as follows:
#rec{some_field :: Type}- Any unspecified fields are assumed to have the type in the original + Any unspecified fields are assumed to have the type in the original record declaration.
- +Specifications for Functions @@ -459,9 +459,9 @@ else a compilation error occurs.
- This form can also be used in header files (.hrl) to declare type - information for exported functions. - Then these header files can be included in files that (implicitly or + This form can also be used in header files (.hrl) to declare type + information for exported functions. + Then these header files can be included in files that (implicitly or explicitly) import these functions.
@@ -475,14 +475,14 @@
-spec Function(ArgName1 :: Type1, ..., ArgNameN :: TypeN) -> RT.- A function specification can be overloaded. + A function specification can be overloaded. That is, it can have several types, separated by a semicolon (
; ):-spec foo(T1, T2) -> T3 ; (T4, T5) -> T6.- A current restriction, which currently results in a warning + A current restriction, which currently results in a warning (not an error) by the compiler, is that the domains of the argument types cannot overlap. For example, the following specification results in a warning: @@ -491,9 +491,9 @@ -spec foo(pos_integer()) -> pos_integer() ; (integer()) -> integer().
- Type variables can be used in specifications to specify relations for - the input and output arguments of a function. - For example, the following specification defines the type of a + Type variables can be used in specifications to specify relations for + the input and output arguments of a function. + For example, the following specification defines the type of a polymorphic identity function:
@@ -542,8 +542,8 @@ -spec foo({X, integer()}) -> X when X :: atom() ; ([Y]) -> Y when Y :: number().
- Some functions in Erlang are not meant to return; - either because they define servers or because they are used to + Some functions in Erlang are not meant to return; + either because they define servers or because they are used to throw exceptions, as in the following function:
my_error(Err) -> erlang:throw({error, Err}).@@ -555,4 +555,3 @@
-spec my_error(term()) -> no_return().- -- cgit v1.2.3