次のコードを機能させることは可能ですか?
def zeroTo[N <: Nat]:Sized[List[Int], N] = {
new Sized[List[Int], N](List.iterate(0, toInt[N])(1+)) {
type A = Int
}
}
「パラメータtoIntNの暗黙の値が見つかりませんでした:shapeless.ToInt[N]」というコンパイルエラーが発生します。
次のコードを機能させることは可能ですか?
def zeroTo[N <: Nat]:Sized[List[Int], N] = {
new Sized[List[Int], N](List.iterate(0, toInt[N])(1+)) {
type A = Int
}
}
「パラメータtoIntNの暗黙の値が見つかりませんでした:shapeless.ToInt[N]」というコンパイルエラーが発生します。
コンテキストバウンドを追加するだけです。
def zeroTo[N <: Nat: ToInt]: Sized[List[Int], N] = {
new Sized[List[Int], N](List.iterate(0, toInt[N])(1+)) {
type A = Int
}
}
それは私たちに与えます:
scala> zeroTo[_6]
res0: shapeless.Sized[List[Int],shapeless.Nat._6] = List(0, 1, 2, 3, 4, 5)
これは、次を使用してほぼ同等に記述できることに注意してくださいwrap
。
def zeroTo[N <: Nat: ToInt]: Sized[List[Int], N] =
Sized.wrap(List.iterate(0, toInt[N])(1+))
更新:Shapeless 2.2.0のバージョン:
def zeroTo[N <: Nat: ToInt]: Sized[List[Int], N] = {
Sized.wrap[List[Int], N]( List.iterate( 0, toInt[N] )( 1+ ) )
}