2016-10-10 33 views
3

工作:無形:FnToProduct不是一個類型構造爲什麼這個工程預期

def method1[L <: HList, M <: HList, F, R](list: L)(builder: F) 
      (implicit ev: Comapped.Aux[L, Seq, M], 
      fntp: FnToProduct.Aux[F, M => R]) = println("asd") 

method1(Seq("asd") :: HNil) { (s: String) => 
    6 
} 

但是,這不?

def method2[L <: HList, M <: HList, F, R](list: L)(builder: F) 
      (implicit ev: Comapped.Aux[L, Seq, M], 
      fntp: FnToProduct.Aux[F, M => Seq[R]]) = println("asd") 

method2(Seq("asd") :: HNil) { (s: String) => 
    Seq(6) 
} 

似乎在FnToProduct.Aux的返回類型中添加一個類型構造函數會將其分解。

回答

3

的問題是,當編譯器試圖推斷類型參數method1,它會找到LMF沒有問題,但是當它到達R它不會是能夠告訴大家, FnToProduct.Aux的第二個參數的形狀與M => Seq[R]對齊。

關閉我的頭頂我沒有一個很好的解釋爲什麼會發生這種情況在第二種情況下,而不是第一種,但它是一個限制,你會經常運行,並且有幾個解決方法。

首先將關閉FnToProduct完全。根據你的實際方法在做什麼,這可能會很好,但是如果你需要明確地參考R,它不會起作用。

第二個解決方法是讓這第二個類型參數的返回類型進行推斷,然後索要證據,這是一個Seq

import shapeless._, ops.function.FnToProduct, ops.hlist.Comapped 

def method2[L <: HList, M <: HList, F, S, R](list: L)(builder: F) 
    (implicit 
    ev: Comapped.Aux[L, Seq, M], 
    fntp: FnToProduct.Aux[F, M => S], 
    s: S <:< Seq[R] 
) = println("asd") 

method2(Seq("asd") :: HNil) { (s: String) => Seq(6) } 

這是一點點額外的語法噪音,但它的工作原理。

相關問題