[Haskell] HList with new records, in darcs.haskell.org

oleg at pobox.com oleg at pobox.com
Sun Jul 2 20:59:05 EDT 2006


The HList library of strongly typed heterogenous lists, records,
type-indexed products (TIP) and co-products is now accessible via
DARCS 
	http://darcs.haskell.org/HList/

The library contains a new representation for open records. Previously
(Record.hs) a record is a Scheme-like heterogenous associative list,
that is, the list of pairs of field label and the corresponding field
value. The HList library uses the type of the label, therefore, the
run-time representation of the label is actually `undefined'. Thus, a
record built as
	rec1 = label1 .=. True .*. lab2 .=. 'c' .*. emptyRecord
has the run-time representation
	HCons (undefined,True) (HCons (undefined,'c) HNil)

In the new representation, RecordP.hs in the repository, the record is
a heterogeneous list of field values. Label _types_ are also bundled in a
heterogenous list of types, which annotate the record type as a
phantom type. Thus if we write
	rec2 = label1 .=. True .*. lab2 .=. 'c' .*. emptyRecordP

rec2 now has the run-time representation of 
	HCons True (HCons 'c HNil)

That is, labels are nowhere to be found in the run-time
representation. Field labels become compile-time-only entity. Of
course, by making labels Typeable and using the methods of that class
it is possible to access the label information at run-time, if so
desired. 

The new representation of the records supports the old record
interface; for example, both (rec1 .!. lab2) and (rec2 .!. lab2)
evaluate to 'c', the value of the field lab2. RecordP are similar to
TIP; however, the values of RecordP are indexed by the label types
rather than by their own types. RecordP have an advantage for
representing tables -- homogenous collections of rows, which in turn are
records of fields (columns):
	newtype Table ls vs = Table [RecordP ls vs]
All records have exactly the same field types in the same
sequence. The run-time representation of the table is just the
collection of all the field values. The database schema, labels and
the column types, is a compiled-time entity and used for checking and
compiling of database operations. 


More information about the Haskell mailing list