函数中需要两个含义,但是我不能在它中使用它们
相同的参数列表,因为我得到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)
}
答案 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
别名使我们的代码更易于阅读和编写,但它们不会改变我们能够或不能改变任何有意义的代码方式。