使用无形状类型不等式时,如何自定义Scala模糊隐式错误 def typeSafeSum[T

使用无形状类型不等式时,如何自定义Scala模糊隐式错误 def typeSafeSum[T,scala,shapeless,Scala,Shapeless,shapeless的=:!=(和类似的类型不等式运算符)固有地利用歧义隐式将Prolog样式的否定编码为失败。而且,正如您所观察到的,Scala没有一种机制允许库作者在预期歧义时提供更有意义的错误消息。也许它应该,或者Scala应该提供类型maki否定的更直接表示不需要这种编码 考虑到你已经用Nats表达了这个问题,我认为你尝试处理类型不平等可能是合理的。如果不是Nats我的建议是直接编码兴趣关系的类型类也适用于这里。尽管如此,我还是推荐与worka相同的解决方案无法提供更好的错误消息的回合 d

shapeless的
=:!=
(和类似的类型不等式运算符)固有地利用歧义隐式将Prolog样式的否定编码为失败。而且,正如您所观察到的,Scala没有一种机制允许库作者在预期歧义时提供更有意义的错误消息。也许它应该,或者Scala应该提供类型maki否定的更直接表示不需要这种编码

考虑到你已经用
Nats
表达了这个问题,我认为你尝试处理类型不平等可能是合理的。如果不是
Nats
我的建议是直接编码兴趣关系的类型类也适用于这里。尽管如此,我还是推荐与worka相同的解决方案无法提供更好的错误消息的回合

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) //compilation error, ambiguous implicit found.
import shapeless.u,nat.u,ops.nat_
@annotation.implicitNotFound(msg=“${A}+${B}=${N}”)

trait SumNotN[可能与not真的是相同的,我问了那个问题,隐式未找到注释与不明确的隐式未找到例外不同Tanks对于你的答案,我同意这仍然相当沉重…也许我们应该为新的Scala版本使用含糊不清的未找到注释:)
import shapeless._, nat._, ops.nat._

@annotation.implicitNotFound(msg = "${A} + ${B} = ${N}")
trait SumNotN[A <: Nat, B <: Nat, N <: Nat]
object SumNotN {
  implicit def sumNotN[A <: Nat, B <: Nat, R <: Nat, N <: Nat]
    (implicit sum: Sum.Aux[A, B, R], error: R =:!= N): SumNotN[A, B, N] =
      new SumNotN[A, B, N] {}     
}

def typeSafeSum[T <: Nat, W <: Nat](x: T, y: W)
  (implicit valid: SumNotN[T, W, _7]) = x

scala> typeSafeSum(_3, _4)
<console>:20: error: shapeless.nat._3 + shapeless.nat._4 = shapeless.nat._7
              typeSafeSum(_3, _4)
                         ^