2017-03-22 18 views
0

如何添加多個項目到HList添加多個元素到無定形HList

我天真的版本不編譯:

(1 to 100).foldLeft(HNil)((l,i) => i :: l) 

對於普通List s此方法將工作做好。然而,對於HList,我假設,它需要提供一個Poly2,它需要一個項目和一個HList並返回附加列表。

當然,如果有更好的方法來添加多個項目,那些方法將非常感激。

+0

結果的類型是什麼? –

+0

@CyrilleCorpet只有Ints的HList,所以我想它會是Int :: ... :: Int :: HNil(當然,在這個簡單的例子中,我可以使用一個普通的列表,但是我的實際用例更復雜,我已經在這個初始階段失敗了。) –

+0

'foldLeft'如何返回一個類型,這取決於它所應用的列表的長度?你的問題是你想要將動態信息(範圍的長度)轉換成靜態信息(「HList」的長度,它的類型是編碼的)。你將無法做到這一點。 –

回答

0

這可能是XY problem。但是你想在這裏做什麼可以用一個Sized集合來完成。

scala> import shapeless._, syntax.sized._ 
import shapeless._ 
import syntax.sized._ 

scala> (1 to 10).reverse.toList.ensureSized[nat._10].toHList 
res1: shapeless.::[Int,shapeless.::[Int,shapeless.::[Int,shapeless.::[Int,shapeless.::[Int,shapeless.::[Int,shapeless.::[Int,shapeless.::[Int,shapeless.::[Int,shapeless.::[Int,shapeless.HNil]]]]]]]]]] = 10 :: 9 :: 8 :: 7 :: 6 :: 5 :: 4 :: 3 :: 2 :: 1 :: HNil 

如果你想有一個範圍的100你有nat._100不存在這個問題,所以你必須創建自己。我只是計算它:

val prod = the[ops.nat.Prod[nat._10, nat._10]] 
type _100 = prod.Out 
(1 to 100).reverse.toList.ensureSized[_100].toHList 
+0

是的,你的權利,這是一個XY問題,謝謝你的提示。我只是想要添加幾千個元素來執行一些簡單的基準測試(因爲我想使用HList一個簡單的異構映射,而不需要任何implicits等,但是,這具有O(n)讀取的缺點訪問,因此我想基準它)。 –