使用Shapeless在类型级别的校验和

时间:2017-02-07 14:12:24

标签: scala shapeless

我按照这个problem提出了以下内容:

enter image description here

package net

import shapeless.{::, HNil, _}
import ops.hlist.IsHCons
import nat._
import ops.nat.{Mod, Prod, Sum}

trait IsValid[A]
object IsValid {

  def apply[L <: HList](implicit ev: IsValid[L]) = ev

  //  account number:  3  4  5  8  8  2  8  6  5
  //  position names:  d9 d8 d7 d6 d5 d4 d3 d2 d1
  //
  //  checksum calculation:
  //    (d1+2*d2+3*d3 +..+9*d9) mod 11 = 0
  implicit def validNumber[D9 <: Nat, D8 <: Nat, D7 <: Nat, D6 <: Nat, D5 <: Nat, D4 <: Nat, D3 <: Nat, D2 <: Nat, D1 <: Nat,
                           P9 <: Nat, P8 <: Nat, P7 <: Nat, P6 <: Nat, P5 <: Nat, P4 <: Nat, P3 <: Nat, P2 <: Nat, P1 <: Nat,
                           S1 <: Nat, S2 <: Nat, S3 <: Nat, S4 <: Nat, S5 <: Nat, S6 <: Nat, S7 <: Nat, S8 <: Nat](
    implicit p9: Prod.Aux[D9, _9, P9],
    p8 : Prod.Aux[D8, _8, P8],
    p7 : Prod.Aux[D7, _7, P7],
    p6 : Prod.Aux[D6, _6, P6],
    p5 : Prod.Aux[D5, _5, P5],
    p4 : Prod.Aux[D4, _4, P4],
    p3 : Prod.Aux[D3, _3, P3],
    p2 : Prod.Aux[D2, _2, P2],
    p1 : Prod.Aux[D1, _1, P1],
    s1: Sum.Aux[P9, P8, S1],
    s2: Sum.Aux[P7, S1, S2],
    s3: Sum.Aux[P6, S2, S3],
    s4: Sum.Aux[P5, S3, S4],
    s5: Sum.Aux[P4, S4, S5],
    s6: Sum.Aux[P3, S5, S6],
    s7: Sum.Aux[P2, S6, S7],
    s8: Sum.Aux[P1, S7, S8],
    mod: Mod.Aux[S8, _11, _0]
  ): IsValid[D9 :: D8 :: D7 :: D6 :: D5 :: D4 :: D3 :: D2 :: D1 :: HNil] = {
    new IsValid[D9 :: D8 :: D7 :: D6 :: D5 :: D4 :: D3 :: D2 :: D1 :: HNil] {}
  }


}

它似乎适用于0案例:

scala> import net.IsValid, shapeless._, nat._
import net.IsValid
import shapeless._
import nat._

scala> IsValid[_0 :: _0 :: _0 :: _0 :: _0 :: _0 :: _0 :: _0 :: _0 :: HNil]
res0: net.IsValid[shapeless.::...

但是,当我打电话给以下&#34;有效&#34;组合,控制台显示没有输出,即挂起。

scala> IsValid[_3 :: _4 :: _5 :: _8 :: _8 :: _2 :: _8 :: _6 :: _5 :: HNil]

在问这个问题之前我只等了约2分钟。

我假设它正在进行隐式查找,但我不确定。

为什么以上呼叫会挂起?也许我的代码中有错误?

0 个答案:

没有答案