scala – 你怎么说没有形状证明是空类型(即假的)
发布时间:2020-12-16 08:59:40 所属栏目:安全 来源:网络整理
导读:我想编写一个以Nat为参数的函数,并且如果此nat不能被3整除,则返回此nat. 例如 : def myFunction[N : Nat](n :N)(implicit ev: /* what do I put here that say not divible by 3 ? */): N = n 要做到这一点,我必须写一些说“N不能被_3整除”的东西,或者“Mo
我想编写一个以Nat为参数的函数,并且如果此nat不能被3整除,则返回此nat.
例如 : def myFunction[N <: Nat](n :N)(implicit ev: /* what do I put here that say not divible by 3 ? */): N = n 要做到这一点,我必须写一些说“N不能被_3整除”的东西,或者“Mod.Aux [N,_3,_0]是空类型” 我怎么能在无形的情况下做到这一点? 解决方法
在这种特殊情况下最简单的方法可能只是使用=:!=(尽管请注意您需要一个新的类型参数):
import shapeless._,nat._,ops.nat.Mod def myFunction[N <: Nat,R <: Nat](n: N) (implicit mod: Mod.Aux[N,R],neq: R =:!= _0) = n 更一般地说,将这种约束表达为类型类并不太难: trait NotDivBy3[N <: Nat] object NotDivBy3 { implicit def notDivBy3[N <: Nat]: NotDivBy3[N] = new NotDivBy3[N] {} implicit def notDivBy3Ambig[N <: Nat] (implicit ev: Mod.Aux[N,_0]): NotDivBy3[N] = unexpected } def myFunction[N <: Nat: NotDivBy3](n: N) = n 或者甚至更普遍: trait DoesntHave[N <: Nat,Prop[_ <: Nat]] object DoesntHave { implicit def doesntHave[N <: Nat,Prop[_ <: Nat]]: DoesntHave[N,Prop] = new DoesntHave[N,Prop] {} implicit def doesntHaveAmbig[N <: Nat,Prop[_ <: Nat]] (implicit ev: Prop[N]): DoesntHave[N,Prop] = unexpected } type Mod3Is0[N <: Nat] = Mod.Aux[N,_0] type NotDivBy3[N <: Nat] = DoesntHave[N,Mod3Is0] def myFunction[N <: Nat: NotDivBy3](n: N) = n 这两种解决方案都使用与=:!=相同的机制(即它们依赖于Scala编译器如果有两个不能优先考虑的候选者则无法找到隐含值的事实). 我可能倾向于采用第二种方法,除非我发现我需要相同类型的许多约束,在这种情况下,第三种可能更清洁. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |