2015-10-19 26 views
2

我有這樣如何使函數獲取HList

implicit def func[T <: HList, F, R](
    implicit fp: FnToProduct.Aux[F, Reverse[T]#Out => R], 
    rev: Reverse[T]): (F, T) => R = 
    (f: F, t: T) => f.toProduct(t.reverse) 

樣本代碼,所以我要的是要問編譯器隱式解析函數F採取HList作爲其輸入的反向的反向和輸出R。例如,

type R = java.util.Date 
type F2 = Function2[String, Int, R] 
type TT = Int :: String :: HNil 

implicitly[(F2, TT) => R] 

雖然implicit func編譯,上面的示例代碼無法解決隱我想它應該是能夠找到。它有什麼問題?

+0

似乎問題在於'隱式FnToProduct.Aux'無法解決。 '隱式地[FnToProduct.Aux [F2,String :: Int :: HNil => R]]'編譯,而'隱式地[FnToProduct.Aux [F2,Reverse [TT] #Out => R]]'不會。如何使它工作...? – Sheng

回答

4

類型投影在Shapeless中很少用到,因爲編譯器靜態地不知道關於Reverse[T]#Out。如果你可以寫rev.Out代替它,那將會很好,但你不能(這是a long story ...)。相反,你需要添加一個類型參數來表示反向HList

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

implicit def func[T <: HList, TR <: HList, F, R](implicit 
    fp: FnToProduct.Aux[F, TR => R], 
    rev: Reverse.Aux[T, TR] 
): (F, T) => R = (f: F, t: T) => fp(f)(rev(t)) 

這將如預期,但我建議不把這樣的函數爲隱式作用域。

+0

工作。我只是編寫一個例子來描述我遇到的問題:)無論如何不會將它放到隱式作用域中。非常感謝! – Sheng