i in situation below: import scalaz.leibniz._ trait exp[t, c] { def &&(that: exp[t, c])(implicit evt: t === boolean) = logicaland(this, that) def &&(that: exp[t, c])(implicit evt: t === int) = bitwiseand(this, that) } case class logicaland[c](e1: exp[boolean, c], e2: exp[boolean, c]) extends exp[boolean, c] case class logicalor[c](e1: exp[boolean, c], e2: exp[boolean, c]) extends exp[boolean, c] ... case class bitwiseand[c](e1: exp[int, c], e2: exp[int, c]) extends exp[int, c] case class bitwiseor[c](e1: exp[int, c], e2: exp[int, c]) extends exp[int, c] ... the trait exp[t,c] base trait , ast dsl, overload built-in scala operators in trait allow infix notation on dsl, constrain of these methods bound on type t @ trait level same operation here '&&' has different semantics depending on type t. it seems leibniz subsitution not/cannot work here (maybe because defined functors f[_] single argument): [error] /home/remi/projects/dsl/src...