[m-dev.] Laziness modules

Peter Moulder Peter.Moulder at infotech.monash.edu.au
Tue May 5 23:49:23 AEST 2009

On Tue, May 05, 2009 at 05:04:53PM +1000, Ralph Becket wrote:
> I put a couple of modules providing support for lazy computation
> together at the weekend.  Is there any interest in adding these to the
> library?  Laziness gives us what in the C# and Java worlds they call
> "enumerables" and are using to good effect.

Can you comment on how this compares with mercury-extras/lazy_evaluation/ ?

It looks like the two use different names for the same concepts; it would be
good to change the two to share names (perhaps leaning slightly towards
choosing lazy_evaluation's names, to the extent that we think users of your new
module may already have used lazy_evaluation).

The documentation in lazy_evaluation largely applies to both, but it would be
good to draw attention to any differences.

I'm afraid I haven't looked carefully at the lazy implementation itself; the
remainder of this message pertains to the less important stuff, the lazy_list

I notice that lazy_list.take (both in lazy_evaluation and the newer version)
corresponds to list.take_upto rather than list.take.  That seems unfortunate.

Similarly lazy_list.drop (in the new version; not present in lazy_evaluation).

lazy_list.take_while doesn't exactly correspond to list.takewhile:
list.takewhile is a predicate and has an additional AfterList argument
(the rest of the list).  However, I think I'd ignore list.takewhile here.

ints: Consider either documenting that the result is undefined if Hi is
int.max_int, or make it work if Hi is int.max_int.


  Similar issue as with ints, except there are more Hi values with that issue if Step > 1.

  The documentation is unclear, btw: a literal reading is that Max = Hi.  (Adding
  the word `such' would suffice for me.)

  Also, my reading of the documentation is that ints_with_step(10, 1, -1) returns
  a non-empty list.

  However you resolve that, consider explicitly drawing attention to the behaviour
  if Step is non-positive.

  Copy-and-paste bug s/ints/ints_with_step/ in documentation.

  Consider using Mercury-style `=<' rather than `<=' in the documentation.

(I wouldn't bother mentioning int_max in documentation for ints_from or
 ints_from_with_step: in this case it follows from the general principle of
 overflow behaviour being undefined for Mercury int's, whereas I do think it
 worth mentioning for ints and ints_with_step because (a) whether or not
 overflow occurs in ints or ints_with_step is an implementation detail; and
 (b) it's relatively common to want to pass max_int for ints-like predicates.)

> multiple_of(X, Y) :- Y mod X = 0.

Suggest s/mod/rem/.  (I know it's intended to be simple rather than efficient,
but I don't consider mod as clearly simpler than rem.  Though I've no strong
objection to mod if you prefer it.)

mercury-developers mailing list
Post messages to:       mercury-developers at csse.unimelb.edu.au
Administrative Queries: owner-mercury-developers at csse.unimelb.edu.au
Subscriptions:          mercury-developers-request at csse.unimelb.edu.au

More information about the developers mailing list