2014-09-23 135 views
2

功能需要兩個implicits,但我不能讓他們在 相同的參數列表中,因爲我得到dependent method type。所以我 再次考慮currying,但這給我一個語法錯誤。 這樣做的正確方法是什麼?類型依賴implicits

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

您不能在不同的參數列表中存在隱含。他們必須放在最後一起。 – goral 2014-09-23 06:39:56

+0

你應該調查'Aux'模式的形狀:它來解決這個問題。 – 2014-09-23 06:52:39

回答

1

我編輯MaybeAdd有一個Aux型,由@milessabin的建議。

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)) 
} 
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」Luuui。

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

基本上輔助只是一種方式來提取型水平計算

的結果正如所指出的「Why is the Aux technique required for type-level computations?

Aux類型別名是完全句法方便。

與以這種方式寫出類型優化相比,Aux版本具有兩個優點:它不那麼嘈雜,並且它不要求我們記住類型成員的名稱。
雖然這些純粹是人體工程學問題,但Aux別名使我們的代碼更易於閱讀和編寫,但它們不會以任何有意義的方式更改我們可以或不可以對代碼執行的操作。