[m-users.] Usage of inst subtypes with list.foldl in rotd

Paul Bone paul at bone.id.au
Tue Mar 3 11:09:44 AEDT 2015


On Sun, Mar 01, 2015 at 08:29:47PM +0100, Dirk Ziegemeyer wrote:
> Dear,
> 
> during migrating my app from mercury version 14.01.1 to rotd-2015-02-20, I discovered that I can’t use list.foldl any more with inst subtypes.
> 
> Julien noticed already that some parts of the mode checker have been tightened up and that this would require some modifications in my code.
> 
> As a workaround I use foldl with a slightly different mode declaration:
> 
> Instead of:
> :- mode foldl(pred(in, in, out) is det, in, in, out) is det.
> 
> This mode declaration solved the issue:
> :- mode foldl(pred(in(I0), in(I1), out(I1)) is det,
>               in(list(I0)), in(I1), out(I1)) is det.
> 

Yes, the mode analysis has been made "tighter", in other words it does a
better job of enforcing correctness and rejecting mode-incorrect programs.

> Is there a way, I could use list.foldl from the standard library again?

Not that I know of.  I wouldn't recommend this either as your program was
always mode-incorrect but the compiler didn't do a very good job of telling
you.  I agree that it is uncomfortable that this is now incompatible.

I suggest creating your own mode-polymorphic foldl predicate, similar to
what you have done, and making it part of your application.  You will
probably need to name it something other than foldl so I suggest
foldl_modepoly.

The long term solution to this is to make the predicates in the standard
library mode-polymorphic.  The legend (it was before I joined the project)
is that when we tried this mode analysis was too slow and the costs
outweighed the benefits.  Someone ought to correct me if I'm wrong.

Thanks.

-- 
Paul Bone



More information about the users mailing list