返回Shapeless中大小为n的List的方法

时间:2012-08-07 15:27:36

标签: scala scala-2.10 shapeless

是否可以使以下代码有效?

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]”。

1 个答案:

答案 0 :(得分: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+ ) )
}