给出一个Sized
列表。如果头部存在,那么如何有选择地修改头部?
也就是说,如何定义ff:
def addOneToHeadIfExists[N <: Nat](l: Sized[IndexedSeq[Int], N]): Sized[IndexedSeq[Int], N] = ???
也就是说,我可能会调用:
val x: Sized[IndexedSeq[Int], _3] = Sized(1, 2, 3)
addOneToHeadIfExists(x) // gives Sized(2, 2, 3)
val y: Sized[IndexedSeq[Int], _0] = Sized() // sample. doesn't actually compile
addOneToHeadIfExists(x) // gives Sized()
发布于 2016-05-23 15:26:55
shapeless的大小类型的主要目的是在编译时提供关于值的足够信息,从而不需要对这种类型的属性进行运行时测试。
验证大小的集合是否是非空的,从而验证head
和tail
是否定义良好是非常简单的,在shapeless中,隐式证据不是立即需要的,这是很少见的情况之一。这是因为我们可以通过在长度类型参数中至少需要一个外部Succ
类型构造函数来捕获序列大小大于0的约束。
这给了我们
def addOneToHead[N <: Nat](l: Sized[IndexedSeq[Int], Succ[N]]):
Sized[IndexedSeq[Int], Succ[N]] = (l.head+1) +: l.tail
此方法针对所有N
的长度为Succ[N]
的大小序列定义,其中N
是Nat
,即对于所有大于0的nats。
示例REPL会话,
scala> addOneToHead(Sized(1, 2, 3))
res0: shapeless.Sized[IndexedSeq[Int],shapeless.Succ[shapeless.nat._2]] =
Vector(2, 2, 3)
scala> addOneToHead(Sized())
<console>:16: error: polymorphic expression cannot be instantiated to expected type
found : [CC[_]]shapeless.Sized[CC[Nothing],shapeless._0]
required: shapeless.Sized[IndexedSeq[Int],shapeless.Succ[?]]
addOneToHead(Sized())
^
正如您所看到的,这是一个类型错误,因为编译器无法为任何nat类型N
统一类型_0
和Succ[N]
。
https://stackoverflow.com/questions/37384298
复制相似问题