3
私はparamsなしの方法があると仮定します。どのようにタイプパラメータの長さを決定できますか?HListタイプの長さNatの観点からの長さ
def func[T <: HList]: Nat = {
// some magic
}
私はparamsなしの方法があると仮定します。どのようにタイプパラメータの長さを決定できますか?HListタイプの長さNatの観点からの長さ
def func[T <: HList]: Nat = {
// some magic
}
あなたはHList
のNat
長さを計算するために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
Whaaaaat ........多分誰かが、より直接的な組み込みの方法で助けることができますか? paramemterの '' lenght ''はどういう意味ですか? –