<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=us-ascii" http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Dear Ralph,<br>
<br>
<br>
the pseudo-program, fringe.m, was attached to my last mail.<br>
<br>
Maybe it was not readable - here in plain text, again:<br>
<br>
%%% snip %%%%%%%%%%%%%%%%%<br>
:-module fringe.<br>
:-interface.<br>
:-import_module io.<br>
:-pred main(io::di, io::uo) is det.<br>
<br>
:-typeclass fringe(Q) where<br>
    [<br>
     pred empty(Q::in) is semidet,<br>
     func tail(Q)= Q,<br>
     %func insert(T, Q)= Q <= node(T),<br>
     func first(Q)= T <= node(T)<br>
    ].<br>
<br>
:-typeclass node(NodeT) where<br>
    [<br>
      pred show(NodeT::in, io::di, io::uo) is det<br>
    ].<br>
<br>
%%===============================================<br>
:-implementation.<br>
:-import_module list, queue, exception.<br>
    <br>
:-instance fringe(queue(T)) <= node(T) where<br>
    [<br>
     pred(empty/1) is queue.is_empty,<br>
     func(tail/1) is q_tail,<br>
     %func(insert/2) is q_insert,<br>
     func(first/1) is first<br>
    ].<br>
<br>
:-instance node(int) where<br>
    [<br>
      pred(show/3) is io.write_int<br>
    ].<br>
<br>
<br>
:-func q_insert(T, queue(T))= queue(T) <= node(T).<br>
q_insert(Dink, Queue)= queue.put(Queue, Dink).<br>
<br>
:-func q_tail(queue(T))= queue(T).<br>
q_tail(Queue)= Tail :-<br>
    (if queue.get(Queue, _F, T) then Tail = T<br>
    else throw("! empty fringe...")).<br>
<br>
:-func q_first(queue(T))= T <= node(T).<br>
q_first(Queue)= First :-<br>
    (if queue.first(Queue, F) then First = F<br>
    else throw("! empty fringe...")).<br>
<br>
<br>
:-func first2(queue(T))= T <= node(T).<br>
first2(Q)= first(Q).<br>
<br>
main(!IO) :-<br>
    Q0 = queue.delete_all(queue.list_to_queue([1]), 1),<br>
    Q2 = queue.list_to_queue([2,3]),<br>
    (if empty(Q0) then write_string("Q0 is empty\n", !IO)<br>
    else write_string("Q0 isn't empty\n", !IO)),<br>
    (if empty(Q2) then write_string("Q2 is empty\n", !IO)<br>
    else write_string("Q2 isn't empty\n", !IO)),<br>
    write_string("tail of Q2: ", !IO),<br>
    Tail = tail(Q2),<br>
    write(Tail, !IO),<br>
    nl(!IO),<br>
    write_string("first of Q2: ", !IO),<br>
    %_First = first2(Q2),<br>
    %show(First, !IO),<br>
    nl(!IO).<br>
%%% snap %%%%%%%%%%%%%%%%%<br>
<br>
The compiler messages are, as told, of )o+>0.13.<br>
<blockquote cite="mid20061004012649.GZ14729@ceres.csse.unimelb.edu.au"
 type="cite">
  <pre wrap="">
  </pre>
  <blockquote type="cite">
    <pre wrap="">   (1) 'O-tone R.B.':
   > The empty/0 func causes us some grief, since it doesn't mention T;
   instead
   > we need to jump through a hoop like
   > func empty(T) = S, % T is a dummy arg to make the types work
   > mode empty(unused) = out is det,
   > which isn't very satisfying.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Here you've omitted the context, which was a discussion of 
type classes for collections, where there is a collection type and an
item type.  Functional dependencies now handle the empty/0 situation.
  </pre>
</blockquote>
Hey, 'type classes for collections' totally hits my point... ;-) <br>
<br>
If you say 'empty/0', (i.e., func constant= T::out) is possible now,
that is more than I would wish for... :-)<br>
<blockquote cite="mid20061004012649.GZ14729@ceres.csse.unimelb.edu.au"
 type="cite">
  <pre wrap=""></pre>
  <blockquote type="cite">
    <pre wrap="">   (2) 'O-tone R.B.' (others discussed similar ideas in the following):
   > But things get worse: in an instance declaration the parameters must
   all be of the form
   > `typename(typevar, ...)', and not just `typevar', which
   > rules out
   > :- instance sequence(list(T), T).
   > Oh deary me! What is needed, as was discussed at the end of last
   year,
   > is the ability to handle constructor classes, so we could write
   > :- typeclass sequence(S(T)) where [
   >     func empty = S(T),
   >     func cons(T, S(T)) = S(T),
   >     func head(S(T)) = T,
   >     func tail(S(T)) = S(T),
   >     ...
   > ].
   > and
   > :- instance sequence(list(T)).
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Again, functional dependencies can handle many of these cases.
Constructor classes would be even better, but right now adding them is
not a priority.

  </pre>
</blockquote>
I have got 'empty/1' (check pred) and 'tail/1' running - you already
told the same about 'empty/0'... since we are speaking about applying
functional dependencies, you don't mean I can dare to expect 'cons/2'
and 'head/1' are also possible, do you??<br>
<br>
<blockquote cite="mid20061004012649.GZ14729@ceres.csse.unimelb.edu.au"
 type="cite">
  <blockquote type="cite">
    <pre wrap="">   (b) Without a such lore, the compiler seems not to be able to read it
   from the instance declaration (which in fact contains it) - moreover
   it seems to be more serious than just a 'typecast' issue - wrapping a
   typeclass call in an appropriate function lets the compiler finish
   successfully, but seems to produce an endless loop at execution:
   In the attached example code, this loop already happens when
   uncommenting '% _First = first2(Q2),'.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
I don't understand.  If you can produce a short program containing the
problem, that would be good.
  </pre>
</blockquote>
I understand... you need 'fringe.m'...
<blockquote cite="mid20061004012649.GZ14729@ceres.csse.unimelb.edu.au"
 type="cite">
  <pre wrap="">
  </pre>
  <blockquote type="cite">
    <pre wrap="">   Under the bottom line, I guess what I am trying to achieve is finding
   a 'crude way' of having rank two polymorphism with )o+>0.13.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Now you've completely lost me!  I still don't understand what
it is you're trying to achieve.  If you can produce a short
pseudo-program illustrating what you want to do, that would help.
  </pre>
</blockquote>
Of course, I will not hesitate to stop looking for 'a crude way', if
not necessary... :-)<br>
<br>
I am very excited for your reply...,<br>
<br>
<br>
             Nick<br>
</body>
</html>