[m-users.] Programming with advanced type system
Volker Wysk
post at volker-wysk.de
Sat Feb 5 05:41:59 AEDT 2022
Am Freitag, dem 04.02.2022 um 18:59 +0100 schrieb Volker Wysk:
> Am Freitag, dem 04.02.2022 um 18:07 +0100 schrieb Volker Wysk:
> > Hi!
> >
> > I'm diving in Mercury's type system. :-) I have this type:
> >
> > :- type target(P) --->
> > t_wikipage(P)
> > ; t_external(string)
> > ; t_attachment(P, filename)
> > ; t_dangling_wikipage(P)
> > ; t_dangling_attachment(P, filename).
> >
> >
> > And this inst:
> >
> > :- inst att == bound( t_attachment(ground, ground)
> > ; t_dangling_attachment(ground, ground)).
> >
> >
> > Now I want to sort a list of values of type target(P), which have the inst
> > att. I have written a comparison predicate with this declaration:
> >
> > :- pred compare_targets(
> > target(P)::in(att),
> > target(P)::in(att),
> > comparison_result::out)
> > is det <= pagename(P).
> >
> >
> > In module list, there is this declaration:
> >
> > :- pred sort(comparison_pred(X)::in(comparison_pred),
> > list(X)::in,
> > list(X)::out)
> > is det.
> >
> >
> > The type and inst comparison_pred are defined in builtin as:
> >
> > :- type comparison_pred(T) == pred(T, T, comparison_result).
> > :- inst comparison_pred(I) == (pred(in(I), in(I), out) is det).
> > :- inst comparison_pred == comparison_pred(ground).
> >
> >
> > Now, I want to sort a list, using my comparison predicate, but this won't
> > compile. I get a mode error from this code:
> >
> > :- func testlist = list(target(tikipage)).
> > ...
> > list.sort(compare_targets, testlist, Sorted),
> >
> >
> > I think the reason is that in the declaration of sort/3, there the inst
> > comparison_pred/0 is used instead of comparison_pred/1. I think I would need
> > sort to be declared like this:
> >
> > :- pred sort(comparison_pred(X)::in(comparison_pred(I)),
> > list(X)::in,
> > list(X)::out)
> > is det.
> >
> >
> > Am I right? Is there a particular reason for why list/3 is defined as it is?
> > This stuff is outgrowing me...
>
> I think I'm right. I have taken the source code of sort/3 from the MMC
> source code library/list.m and changed the declaration the way I've
> described. Now it works.
Not quite. It needs to be like this:
:- pred sort1(
comparison_pred(X)::in(comparison_pred(I)),
list(X)::in(list(I)),
list(X)::out(list(I)))
is det.
Bye, Volker
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part
URL: <http://lists.mercurylang.org/archives/users/attachments/20220204/be73880d/attachment.sig>
More information about the users
mailing list