This paper describes G, a functional language designed to support data abstraction methodology. The language actually consists of a hierarchy of levels and therefore the description given in the paper is not complete, in the sense that further layers can be built on top of the data abstraction layer. G is a fairly standard functional language with lazy evaluation and higher-order functions. What is different about it is the view that a type is an assertion about a value and is a first-class object. Arbitrary predicates may be used to define a type. The consequence of this is that type-checking cannot be done at compile-time using a Milner-style algorithm, but must be done at run-time. This results in a loss of efficiency (although efficiency was not a consideration in the design of the language) and a reduction in the amount of information about errors that is supplied to the programmer by the compiler.
Apart from several typos, the paper is clear and easy to read. It provides an interesting generalization to the type systems found in most functional languages. This generalization is expensive, however, and the paper does not provide evidence that it is useful.