Thanks Chris for your explanation. This way it works indeed!<div><br></div><div>Though, error reported is rather criptic :-) </div><div>But, however, it is possible to distinguish odd & even size lists at compile time. That's very interesting!</div>
<div><br></div><div><br></div><div>On Thu, Apr 7, 2011 at 7:06 PM, Chris King <span dir="ltr"><<a href="mailto:colanderman@gmail.com">colanderman@gmail.com</a>></span> wrote:</div><div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi Vladmir, glad to see my post is generating some conversation!<br>
<div class="im"><br>
On Thu, Apr 7, 2011 at 10:10 AM, Vladimir Gubarkov <<a href="mailto:xonixx@gmail.com">xonixx@gmail.com</a>> wrote:<br>
> And thought, I could try to implement smth like even- (odd-) sized list<br>
> using appropriate modes.<br>
<br>
</div>You can indeed do this.  The only "gotcha" is that the ---> shorthand<br>
<div class="im">for inst definitions isn't as clever as you'd like.  What you wrote:<br>
<br>
> :- inst even_list ---> [] ; [ground,ground|even_list]. % YYY<br>
<br>
</div>expands to this:<br>
<br>
:- inst even_list ---> [] ; [ground | [ground|even_list]].<br>
<br>
The ---> shorthand only works for the top-level constructors; so<br>
Mercury thinks that the inner list cons is an inst rather than a<br>
constructor.  To fix this you can write instead:<br>
<br>
:- inst even_list ---> []; [ground | bound([ground | even_list])].<br></blockquote><div><br></div><div>I wish it could process in-depth )</div><div>Maybe mercury authors could make it more obvious in future releases...</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
Then your code will compile as expected.  I've tested with a couple<br>
functions that consume pairs of elements and it seems to work, but let<br>
me know if you have any trouble.<br>
<br>
Best,<br>
<font color="#888888">Chris<br>
</font></blockquote></div><br></div>