8

次のコードを機能させることは可能ですか?

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]」というコンパイルエラーが発生します。

4

1 に答える 1

10

コンテキストバウンドを追加するだけです。

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+ ) )
}
于 2012-08-07T15:53:59.953 に答える