2016-08-12 17 views
3

私はparamsなしの方法があると仮定します。どのようにタイプパラメータの長さを決定できますか?HListタイプの長さNatの観点からの長さ

def func[T <: HList]: Nat = { 
    // some magic 
} 
+0

Whaaaaat ........多分誰かが、より直接的な組み込みの方法で助けることができますか? paramemterの '' lenght ''はどういう意味ですか? –

答えて

5

あなたはHListNat長さを計算するためにops.hlist.Length操作を使用することができます。

また、不透明であるNatを取得することは、実際の数に関するすべてのタイプレベルの情報を失うため、あまり役に立ちません。だから、関数からの正確なNat型を取得する必要があります。

import shapeless._ 
import shapeless.ops.hlist.Length 

def func[T <: HList](implicit len: Length[T]): len.Out = len() 

使用法:Intはもっとトリッキー思えるよう


scala> natLen[Int :: String :: HNil] 
res1: shapeless.Succ[shapeless.Succ[shapeless._0]] = Succ() 
は長さを取得します。それは N <: Nat型パラメータを必要とし、基本的には無用になるだろうので、あなたが ops.nat.ToIntを使用することはできませんようだ:

def uselessIntLen[T <: HList, N <: Nat](implicit 
    len: Length.Aux[T, N], 
    toInt: ToInt[N] 
): Int = toInt() 

私はHKernelを使用して次の回避策を見つけました(もちろん、それは新しいを書くこともできます手動でIntLengthをタイプ入力してください)。

import shapeless.ops.hlist.HKernelAux 

def intLen[T <: HList](implicit ker: HKernelAux[T]): Int = ker().length 

使用法:

scala> intLen[Int :: String :: HNil] 
res2: Int = 2 
関連する問題