类型依赖的含义

时间:2014-09-23 06:20:04

标签: scala shapeless

函数中需要两个含义,但是我不能在它中使用它们 相同的参数列表,因为我得到dependent method type。所以我 考虑再次调整,但这给了我一个语法错误。 这样做的正确方法是什么?

def add[A](newAnnotations: Seq[A])
    (implicit maybeAdd: MaybeAdd[L, Seq[A]])
    (implicit mod: Modifier[maybeAdd.Out, Seq[A], Seq[A]]):
    Slab[Content, maybeAdd.Out] = {
  val l = maybeAdd(annotations, Seq[A]())
  l.updateWith(_ ++ newAnnotations)
}

2 个答案:

答案 0 :(得分:1)

我根据@milessabin的建议编辑了MaybeAdd以获得Aux类型。

def add[A, Out0](newAnnotations: Seq[A])(implicit maybeAdd: MaybeAdd.Aux[L, Seq[A], Out0], mod: Modifier[Out0, Seq[A], Seq[A]]): Slab[Content, mod.Out] = {
  val l = maybeAdd(annotations, Seq[A]())
  new Slab(content, mod(l, _ ++ newAnnotations))
}

答案 1 :(得分:0)

注意:语法错误可能是:

illegal dependent method type: 
parameter appears in the type of another parameter in the same section or an earlier one 

意思是不能在同一节中使用依赖类型,只能在下一个参数块中使用或仅作为返回类型。

参见" A short introduction to the Aux pattern" byLuigi。

 type Aux[A0, B0] = Foo[A0] { type B = B0  }
  

基本上Aux只是一种提取类型级别计算结果的方法

如" Why is the Aux technique required for type-level computations?"

所述
  

Aux类别别名完全是语法上的便利。

     

Aux版本比以这种方式编写类型细化有一些优点:它不那么嘈杂,并且它不需要我们记住类型成员的名称。
  这些纯粹是符合人体工程学的问题,但Aux别名使我们的代码更易于阅读和编写,但它们不会改变我们能够或不能改变任何有意义的代码方式。