基于peano算法的Scala类型级编程

基于peano算法的Scala类型级编程,scala,generic-programming,type-level-computation,Scala,Generic Programming,Type Level Computation,我从年开始学习scala的type-leve编程。 并在Mod中获取错误 type Mod[A <: Nat, B <: Nat] = A#FoldR[_0, Nat, ModFold[B]] type ModFold[By <: Nat] = Fold[Nat, Nat] { type Wrap[Acc <: Nat] = By#Compare[Acc]#eq type Apply[N <: Nat, Acc <: Nat] = Wrap[S

我从年开始学习scala的type-leve编程。 并在Mod中获取错误

type Mod[A <: Nat, B <: Nat] = A#FoldR[_0, Nat, ModFold[B]]
type ModFold[By <: Nat] = Fold[Nat, Nat] {
    type Wrap[Acc <: Nat] = By#Compare[Acc]#eq
    type Apply[N <: Nat, Acc <: Nat] = Wrap[Succ[Acc]]#IF[_0, Succ[Acc], Nat]
}

toBoolean[ Eq[ Mod[_4, _6], _3] ]


Error:(110, 18) could not find implicit value for parameter b:  BoolRep[Eq[Mod[_4,_6],_3]]
    toBoolean[ Eq[ Mod[_4, _6], _3] ]
             ^

键入Mod[A尝试比较
:t ModFold[_2]#Wrap[Succ[_1]]#如果[_0,Succ[_1],Nat]
:t ModFold[_2]#Apply[_1,_2]
。这应该会告诉你这两种类型的不同之处。
implicitly[ModFold[_2]#Wrap[Succ[_1]]#IF[_0, Succ[_1], Nat] <:< Nat]
// correct

implicitly[ModFold[_2]#Apply[_1, _2] <:< Nat]
// error,  Cannot prove that Bool.this.IF[_0,Succ[_2],Nat] <:< Nat.