[mercury-users] Tagged datatypes and boxing

Richard A. O'Keefe ok at hermes.otago.ac.nz
Mon Sep 27 12:56:49 AEST 1999

I suggested that subranges could be handled by assertions.

	What predicates/functions are you allowed to use in these constraints?
	This seems a little too open-ended to me.  How about:
Open-endedness is precisely what I want at this stage in the discussion.
The whole point is that I don't *know* what everyone will find appropriate
for constraining variables.

	type smallprime = X:integer where 0 < X & X < 1024 & prime(X).
Yes, why not?

	or even just
	type inscrutable = X:integer where 0 < X & X < 512 & X mod 2 =< 1.
	I think just handling good ol' subranges would be a big improvement.
	Maybe something like:
	:- type nat8 = 0..255.
But that is a special purpose syntactic hack that locks out future
improvements.  Primality may be going a bit far, but I _have_ wanted
divisibility (m divides X) and other constraints as well as just
subranges.  It isn't necessary that every possible constraint be
supported to begin with; what is necessary is that potentially
sensible constraints should not arbitrarily be ruled out.

There have been, and still are, programming languages in which
multiple comparisons (like 0 =< X =< 255) are expressible and
work correctly.  I can see no reason why Mercury should not be
one of them.  Make just two changes:

    (1) Adopt mathematical convention:
	E0 R1 E1 ... Rn En
	if and only if v0 R1 v1, v1 R2 v2, ..., vn_1 Rn vn
	where v0 ... vn are the values of E0 ... En

    (2) Adopt a syntax vaguely like
	:- TypeName subtype (Var : Name :- Comparison)
	where Comparison is a numeric comparison

Then you have

    :- integer subtype (X: nat8 :- 0 =< X < 256).

and there is syntactic "room" to allow more general constraints,
such as

    :- list(T) subtype (X: nonempty_list(T) :- X \== []).

Note that I've tacitly adopted the Ada distinction between types
and subtypes here.
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe

More information about the users mailing list