[m-users.] Typeclass error resolving a specific function.

"Sean Charles (emacstheviking)" <[email protected]>
Newsgroups gmane.comp.lang.mercury.general
Message-ID <[email protected]>
I've modified a hit detection system to change the status of objects instead of collecting ids, but when I try to compile now, for this type class definition:

:- typeclass hittable(T) where
[
   func id(T)        = int,
   func as_point(T)  = pointf,
   func as_circle(T) = vector3f,
   func as_rect(T)   = rectangle,
   func is_hit(T)    = bool,
   pred set_hit(T::in, T::out) is det
].

    % Falling object: something to be avoided!
    %
:- instance hittable(fobject) where
[
  id(T)        = T ^fid,
  as_point(T)  = fp_float_pt(T ^xy),
  as_circle(T) = fp_float_v3(T ^xy, 1.0),
  func(as_rect/1) is fo_bounds_rect,
  is_hit(T)    = T ^hit,
  (set_hit(!T) :- !T ^hit := yes)
].

    % Missile: a point like object.
    %
:- instance hittable(missile) where
[
  id(T)        = T ^missile_id,
  as_point(T)  = fp_float_pt(T ^mxy),
  as_circle(T) = fp_float_v3(T ^mxy, 1.0),
  func(as_rect/1) is missile_bounds_rect,
  is_hit(T)    = T ^hit,
  (set_hit(!T) :- !T ^hit := yes)
].

    % Player. The players rocket ship.
    %
:- instance hittable(player) where
[
  id(_)        = -1,
  as_circle(T) = v2_circle(T ^xy, 1.0),
  as_point(T)  = v2_pointf(T ^xy),
  is_hit(_)    = no, %% SAFE?
  func(as_rect/1) is player_bounds_rect,
  (set_hit(!T) :- !T ^hit := yes)   <===== COMPILER ERROR
].

I get this error:

level_ufo.m:767: In clause for type class method implementation:
level_ufo.m:767:   type error in unification of variable `STATE_VARIABLE_T'
level_ufo.m:767:   and functor `hit :='/2.
level_ufo.m:767:   variable `STATE_VARIABLE_T' has type `player.player',
level_ufo.m:767:   functor `hit :='/2 has overloaded type {
level_ufo.m:767:     'hit :='(ufo.ufo, bool.bool): ufo.ufo,
level_ufo.m:767:     'hit :='(player.missile, bool.bool): player.missile,
level_ufo.m:767:     'hit :='(level_ufo.fobject, bool.bool): level_ufo.fobject
level_ufo.m:767:   }.
level_ufo.m:767:   The partial type assignment was:
level_ufo.m:767:     STATE_VARIABLE_T_0_6: player.player
level_ufo.m:767:     STATE_VARIABLE_T_7: player.player
level_ufo.m:767:     V_9: bool.bool


I just can't see why it doesn't like this one but the previous two would appear to be fine, the error message confirms the type T as player.player which is correct but i don't understand why the error is present. Is it because the flags are all called hit in the different discriminated union types ?

Thanks.

_______________________________________________
users mailing list
[email protected]
https://lists.mercurylang.org/listinfo/users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.