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

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编译器如果有两个不能优先考虑的候选者则无法找到隐含值的事实).

我可能倾向于采用第二种方法,除非我发现我需要相同类型的许多约束,在这种情况下,第三种可能更清洁.

(编辑:李大同)

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

    推荐文章
      热点阅读