<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">I am trying t ouse typeclasses for the first time ever and, well, it's not been the happy time I wanted !<div class=""><br class=""></div><div class="">I have a bunch of types for the arguments for the various rendering instructions and I wanted to be able to have a uniform means to generate error messages and other actions across that set of types, for example:</div><div class=""><br class=""></div><div class=""><font face="IBMPlexMono" style="font-size: 14px;" class="">:- type <b class="">leaf</b><br class="">    --->    tk(location, string)<br class="">    ;       kw(location, string)<br class="">    ;       s1(location, string)<br class="">    ;       s2(location, string).<br class=""><br class="">:- type arglist_spec<br class="">    --->    arg_leaf(<b class="">leaf</b>)<br class="">    ;       arg_def(ps, render_inst)<br class="">    ;       arg_ref(ps).<br class=""><br class="">:- type gencall_spec<br class="">    --->    gc_leaf(<b class="">leaf</b>)<br class="">    ;       gc_arg(render_inst)<br class="">    ;       gc_keyword(ps, render_inst) % python-like, foo=bar<br class="">    ;       gc_ref(ps).                 % C or PHP: &foo<br class=""><br class="">:- type call_term<br class="">    --->    ct_leaf(<b class="">leaf</b>)<br class="">    ;       ct_inst(render_inst).<br class=""><br class=""></font>The plan was to be able to call something like `make_error` with one of the above, by supplying the error code and the instance that was being rejected, something like:</div><div class=""><font face="IBMPlexMono" style="font-size: 14px;" class=""><br class=""></font></div><div class=""><font face="IBMPlexMono" style="font-size: 14px;" class="">    Error = make_error(TheInstance, incorrect_form_error)</font></div><div class=""><br class=""></div><div class="">and so I have tried many things, all of them wrong, but I seme to have exhausted the number of wrong ways of doing it without actually finding the correct way to do it. I am still not sure my use case is even what typeclasses are for but it feels correct, from the reference manual section 10.1,</div><div class=""><br class=""></div><div class="">A type class is a name for a set of types (or a set of sequences of types) for which cer- tain predicates and/or functions, called the methods of that type class, are defined. A ‘typeclass’ declaration defines a new type class, and specifies the set of predicates and/or functions that must be defined on a type (or sequence of types) for it (them) to be considered to be an instance of that type class.</div><div class=""><br class=""></div><div class="">so if I have understood it, my set of types are the ones listed above, and the methods (one so far) are make_error so far. I also want to have a function to return a string representation of each instance as well.</div><div class=""><br class=""></div><div class="">Here is my awful attempt,  <i class="">syntax_error, error_msg</i> are types defined elsewhere as is the function <i class="">nowhere,</i></div><div class=""><br class=""></div><div class=""><div class=""><font face="IBMPlexMono" style="font-size: 14px;" class="">:- typeclass tstring(T) where [<br class="">    func make_error(T::in, error_msg::in) = (syntax_error::out) is det<br class="">].<br class=""><br class="">:- instance tstring(leaf) where [   <b class="">LINE 73 <===</b><br class="">    make_error(_X, E) = syntax_error(nowhere, error, E)<br class="">].</font></div><div class=""><br class=""></div></div><div class="">...which gives this error:</div><div class=""><div class=""><br class=""></div><div class=""><font face="IBMPlexMono" style="font-size: 14px;" class="">datatypes.m:073: Error: non-abstract instance declaration in module interface.</font></div><div class=""><font face="IBMPlexMono" style="font-size: 14px;" class="">Making Mercury/ints/datatypes.int</font></div><div class=""><font face="IBMPlexMono" style="font-size: 14px;" class="">datatypes.m:073: Error: non-abstract instance declaration in module interface.</font></div><div class=""><font face="IBMPlexMono" style="font-size: 14px;" class="">** Error making `Mercury/ints/datatypes.int'.</font></div><div class=""><font face="IBMPlexMono" style="font-size: 14px;" class="">make[2]: *** [felt] Error 1</font></div></div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Sean.</div><div class=""><br class=""></div><div class=""><br class=""></div></body></html>