加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在使用无形类型不等式时,如何自定义Scala模糊隐式错误

发布时间:2020-12-16 09:50:29 所属栏目:安全 来源:网络整理
导读:def typeSafeSum[T : Nat,W : Nat,R : Nat](x: T,y: W) (implicit sum: Sum.Aux[T,W,R],error: R =:!= _7) = xtypeSafeSum(_3,_4) //compilation error,ambiguous implicit found. 我不认为错误信息“模糊隐含发现”是友好的,我怎么能自定义它说“2 NAT值的
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.

我不认为错误信息“模糊隐含发现”是友好的,我怎么能自定义它说“2 NAT值的总和不应该等于7”

提前谢谢了

解决方法

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

鉴于你已经用Nats表达了这个问题,我认为你尝试使用类型不等式可能是合理的.如果不是我在answer to another question中的推荐,那么直接编码感兴趣关系的类型类也适用于此.虽然如此,我建议使用相同的解决方案作为解决方法,因为无法提供更好的错误消息.

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,R <: Nat,N <: Nat]
    (implicit sum: Sum.Aux[A,B,error: R =:!= N): SumNotN[A,N] =
      new SumNotN[A,N] {}     
}

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

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

这种技术(隐藏在我们期望在潜在歧义的情况下找不到的隐含的预期模糊隐含)通常是适用的,但显然是相当重量级的……如果可能的话应该避免类型不等式的另一个原因.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读