首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可选择在shapeless中修改大小列表的头部

可选择在shapeless中修改大小列表的头部
EN

Stack Overflow用户
提问于 2016-05-23 14:50:29
回答 1查看 57关注 0票数 1

给出一个Sized列表。如果头部存在,那么如何有选择地修改头部?

也就是说,如何定义ff:

代码语言:javascript
运行
复制
def addOneToHeadIfExists[N <: Nat](l: Sized[IndexedSeq[Int], N]): Sized[IndexedSeq[Int], N] = ???

也就是说,我可能会调用:

代码语言:javascript
运行
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2016-05-23 15:26:55

shapeless的大小类型的主要目的是在编译时提供关于值的足够信息,从而不需要对这种类型的属性进行运行时测试。

验证大小的集合是否是非空的,从而验证headtail是否定义良好是非常简单的,在shapeless中,隐式证据不是立即需要的,这是很少见的情况之一。这是因为我们可以通过在长度类型参数中至少需要一个外部Succ类型构造函数来捕获序列大小大于0的约束。

这给了我们

代码语言:javascript
运行
复制
def addOneToHead[N <: Nat](l: Sized[IndexedSeq[Int], Succ[N]]):
  Sized[IndexedSeq[Int], Succ[N]] = (l.head+1) +: l.tail

此方法针对所有N的长度为Succ[N]的大小序列定义,其中NNat,即对于所有大于0的nats。

示例REPL会话,

代码语言:javascript
运行
复制
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统一类型_0Succ[N]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37384298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档