Data type in Sol is expressed through set membership. Any set (or set expression) can be used to specify type. Compound objects, such as lists or vectors, can be described in terms of the type of their elements. This can be seen in the syntax of the Sol function, which allows the name and type of each parameter to be specified, as well as the type of the return value. This mechanism of type specification is very powerful, since type constraints may be as tight or loose as the programmer wishes, e.g. (function integer ((a real) (b string) (c (set 1 "help!" 3))) ...) specifies an integer-valued function of a real, a string and a member of the set (set 1 "help!" 3), but (function sol ((a number) (b sol)) ...) specifies a function of a number (may be real, complex, etc.) followed by any Sol object, returning any Sol object.