¿Es el valor implícito ambiguo la única forma en que queremos que el error exista en tiempo de compilación?

trait Foo

trait Bar extends Foo

def doStuff[T <: Foo](x: T)(implicit ev: T =!:= Foo) = x

doStuff(new Foo{}) //ambiguous implicit value
doStuff(new Bar)// successful

La resolución implícita está ocurriendo en el tiempo de compilación, por lo que aquí creo que puede haber dos valores implícitos con exactamente el mismo tipo para desencadenarambiguo cosas.

En este momento, voy a presentar una figura sin forma en el equipo, mis colegas piensan que este implícito ambiguo no es ideal, y no tengo una fuerte discusión al respecto. ¿Es esta la única forma de hacerlo para que el tipo sea seguro en scala? Si es así, ¿qué puedo hacer para personalizar el mensaje de error?

Editar:

En el sin forma, quiero hacer que la suma de 2 NAT no sea igual a 7, puedo codificar así para que la compilación falle.

def typeSafeSum[T <: Nat, W <: Nat, R <: Nat](x: T, y: W)
         (implicit sum: Sum.Aux[T, W, R], error: R =:!= _7) = x

typeSafeSum(_3, _4)

pero el mensaje de error es un valor implícito ambiguo, ¿cómo puedo personalizar el mensaje de error?

Respuestas a la pregunta(3)

Su respuesta a la pregunta