_P_l_a_c_e_h_o_l_d_e_r_ _t_y_p_e_s

A placeholder type has  no  values  belonging  to  it  (apart  from  the
undefined  value,  undef, which is a member of every type).  Placeholder
types are declared as follows:

	widget :: _t_y_p_e

this declares `widget' to be a type but gives it no values.

Placeholder types can be used during program development for types whose
representation  is  not  yet  decided.   For  example  given  the  above
declaration we can give type specifications involving widget, e.g.

	foo :: num->widget->widget
	gronk :: [widget]->widget

and write code using `foo' and `gronk' which can at least be checked for
type  correctness,  although  it  will not normally be executable.  At a
later stage the declaration of widget  as  a  placeholder  type  can  be
replaced  by  a  type definition using ==, ::=, or _a_b_s_t_y_p_e, allowing the
functions foo, gronk to be defined.

Placeholder types can have any arity, eg
	table * ** :: _t_y_p_e
This creates a family of types, such as `table num  bool'  and  so
on.  They are all devoid of values (apart from undef).  The general form
of a placeholder type specification is
	tform-list :: _t_y_p_e
where `tform' consists of a typename followed by zero  or  more  generic
type  variables  (and  it  is  permitted  to  declare several such types
simultaneously, separated by commas, whence `tform-list').

A placeholder type may be considered as equivalent to an algebraic  type
with no constructors.

