2013-12-15 66 views
2

所以我想通過HList創建一個映射函數,但是我需要檢查應用函數中的一些條件。水木清華這樣的:在多功能中刪除類型,scala

object test extends Poly1 { 
    implicit def default[L <: HList](implicit head: ops.hlist.IsHCons[L]) = 
    at[L](t => { 
     if(true) t.head else false //here some condition  
    }) 
} 

結果,我們失去約t.head元素的type的所有信息;順便說一句,如果我們建立「清潔」功能:

object test extends Poly1 { 
    implicit def default[L <: HList](implicit head: ops.hlist.IsHCons[L]) = 
    at[L](t => t.head) 
} 

然後,顯然,一切都好。

所以問題是:如何處理它,並做出這樣的功能(如果可能的話)或我應該以另一種方式尋找?爲什麼在這裏可以進行類型擦除?

回答

4

問題不是類型擦除或任何與無形有關的棘手問題 - 它只是推斷的條件表達式類型是兩個分支類型的最小上界,在這種情況下,這是Any。你可以看到同樣的事情發生了普通的老態方法:

scala> def foo[A](a: A) = if (true) a else false 
foo: [A](a: A)Any 

作爲一個側面說明,這將是一個有點更優雅(地道)相匹配,對HList的結構,而不需要一個實例的IsHCons類型:

object test extends Poly1 { 
    implicit def default[H, T <: HList] = at[H :: T](_.head) 
} 

這和你的「乾淨」例子完全一樣。

+0

哦,我明白了,如果我寫下如下:'at [L](if(true)t => t.head else t => false)'我會得到'Any'...它再次所有功能類型的原因? 嗯,所以我想... Thx對於一個關於頭部使用的酷記錄,順便說一句,它會很酷,不會通過所有其他暗示(對於地圖,平面地圖,差異定製助手等等) :D – DaunnC

+0

哦,我完全理解! thx,現在對我來說都很清楚。 – DaunnC