Scala 类型相关隐式

Scala 类型相关隐式,scala,shapeless,Scala,Shapeless,函数中需要两个隐式,但在 相同的参数列表,因为我得到的是依赖方法类型。所以我 考虑再次使用curry,但这给了我一个语法错误。 正确的方法是什么 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] = {

函数中需要两个隐式,但在 相同的参数列表,因为我得到的是
依赖方法类型
。所以我 考虑再次使用curry,但这给了我一个语法错误。 正确的方法是什么

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)
}

我编辑了
MaybeAdd
以获得@milessabin建议的
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))
}

注意:语法错误可能是:

illegal dependent method type: 
parameter appears in the type of another parameter in the same section or an earlier one 
这意味着不能在同一节中使用依赖类型,只能在下一个参数块中使用,或者只能作为返回类型使用

见“byLuigi”

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

如“”所述

Aux
类型别名完全是一种语法上的便利

Aux版本比以这种方式写出类型细化有两个优点:噪音更小,并且不需要我们记住类型成员的名称。
这些都是纯粹的人体工程学问题,虽然
Aux
别名使我们的代码更易于阅读和编写,但它们不会以任何有意义的方式改变我们可以或不能对代码执行的操作


在不同的参数列表中不能有隐式。它们必须放在最后并放在一起。你应该在shapeless中研究
Aux
模式:它的出现正是为了解决这个问题。
 type Aux[A0, B0] = Foo[A0] { type B = B0  }