A type error occurs when an input argument is of the wrong type. In general,
a type is taken to be a class of terms for which there exists a unary type
test predicate. Some types are built-in, such as atom/1
and
integer/1
. Some are defined in library(types)
, such as chars/1
.
The type of a term is the sort of thing you can tell just
by looking at it, without checking to see how big it is. So "integer"
is a type, but "non-negative integer" is not, and "atom" is a type,
but "atom with 5 letters in its name" and "atom starting with x
" are
not.
The point of a type error is that you have obviously passed the wrong sort of argument to a command; perhaps you have switched two arguments, or perhaps you have called the wrong predicate, but it isn't a subtle matter of being off by one.
Most built-in predicates check all their input arguments for type errors.
The exception code associated with a type error is
type_error(Goal, ArgNo, TypeName, Culprit)
Some TypeNames recognized by the system include:
0
-- No type name specified
atom
atomic
callable
db_reference
integer
number
For example, suppose we had a predicate
date_plus(NumberOfDays, Date0, Date)
true when Date0 and Date were date(
Y,
M,
D)
records and NumberOfDays was
the number of days between those two dates. You might see an error
term such as
type_error(/* Goal */ date_plus(27, date(18,mar,11), _235), /* Argno */ 2, /* TypeName */ integer, /* Culprit */ mar