我需要这样的东西:
def encryptBlock(arr: FixedArray[Size16]) = ???
val blocks = arr.splitFixed[Size16]
val encrypted = encryptBlock(FixedArray[Size16]())
因此,确保我只接收128位数组作为输入。
答案 0 :(得分:8)
Shapeless可以为seqs做到这一点:
import shapeless._
import nat._
import syntax.sized._
scala> def func(l: Sized[List[Int], _3]) = l
func: (l: shapeless.Sized[List[Int],shapeless.nat._3])shapeless.Sized[List[Int],shapeless.nat._3]
scala> List(1,2,3,4,5,6).grouped(3).map(_.sized(3).get).map(func)
res26: Iterator[shapeless.Sized[List[Int],shapeless.nat._3]] = non-empty iterator
scala> List(1,2,3,4,5,6).grouped(2).map(_.sized(2).get).map(func)
<console>:25: error: type mismatch;
found : shapeless.Sized[List[Int],shapeless.nat._3] => shapeless.Sized[List[Int],shapeless.nat._3]
required: shapeless.Sized[List[Int],shapeless.Succ[shapeless.Succ[shapeless._0]]] => ?
List(1,2,3,4,5,6).grouped(2).map(_.sized(2).get).map(func)
传递给.size
的参数应为Literal(Constant(n: Int))
,因此您无法传递某些变量或表达式。
也可以将数组转换为某些IndexedSeq
(.toSeq
),例如Vector
(.toVector
)
您还可以使用类型disjunction指定一组可接受的大小:
def func[A <: Nat](l: Sized[List[Int], A])(implicit ev: (_2 with _3) <:< A) = l
func(List(1,2).sized(2).get)
res17: shapeless.Sized[List[Int],shapeless.Succ[shapeless.Succ[shapeless._0]]] = shapeless.Sized@3ac1111f
scala> func(List(1,2,3).sized(3).get)
res18: shapeless.Sized[List[Int],shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]]] = shapeless.Sized@17191095
scala> func(List(1,2,3,4).sized(4).get)
<console>:24: error: Cannot prove that shapeless.nat._2 with shapeless.nat._3 <:< nat_1.N.
func(List(1,2,3,4).sized(4).get)
^
最大-N限制(来自@DougC和@Miles Sabin):
import ops.nat._
import LT._
scala> def func[N <: Nat](l: Sized[List[Int], N])(implicit ev: N < _3) = l
func: [N <: shapeless.Nat](l: shapeless.Sized[List[Int],N])(implicit ev: shapeless.ops.nat.LT.<[N,shapeless.nat._3])shapeless.Sized[List[Int],N]
scala> func(List(1,2).sized(2).get)
res25: shapeless.Sized[List[Int],shapeless.Succ[shapeless.Succ[shapeless._0]]] = shapeless.Sized@3ac1111f
scala> func(List(1).sized(1).get)
res26: shapeless.Sized[List[Int],shapeless.Succ[shapeless._0]] = shapeless.Sized@73f49b57
scala> func(List(1,2,3).sized(3).get)
<console>:30: error: could not find implicit value for parameter ev: shapeless.ops.nat.LT[nat_1.N,shapeless.nat._3]
func(List(1,2,3).sized(3).get)
^