2012-08-07 60 views
7

是否可以使以下代碼有效?返回Shapeless中大小爲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]」。

回答

9

你可以只添加綁定上下文:

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+)) 

更新:版本fo r Shapeless 2.2.0:

def zeroTo[N <: Nat: ToInt]: Sized[List[Int], N] = { 
    Sized.wrap[List[Int], N](List.iterate(0, toInt[N])(1+)) 
} 
相關問題