给定一个无形HList,其中每个列表元素共享相同的类型构造函数,如何对HList进行排序?
例如:
def some[A](a: A): Option[A] = Some(a)
def none[A]: Option[A] = None
val x = some(1) :: some("test") :: some(true) :: HNil
val y = sequence(x) // should be some(1 :: "test" :: true :: HNil)
def sequence[L <: HList : *->*[Option]#?, M <: HList](l: L): Option[M] =
???
Run Code Online (Sandbox Code Playgroud)
我试图实现这样的序列:
object optionFolder extends Poly2 {
implicit def caseOptionValueHList[A, B <: HList] = at[Option[A], Option[B]] { (a, b) =>
for { aa <- a; bb <- b } yield aa …Run Code Online (Sandbox Code Playgroud) 我正在使用sbtosgi插件使用bnd从sbt构建生成OSGi包.sbtosgi包提供了用于生成包的osgi-bundle任务.使用sbtosgi的默认配置,从sbt提示符运行osgi-bundle会更新JAR以包含正确的标头,但运行clean package会导致JAR没有OSGi标头.在Maven中,我正在尝试使用包装= bundle来使用maven-bundle-plugin - 即项目的主要工件应该是OSGi包.
在阅读sbtosgi插件的源代码的基础上,我认为osgi-bundle任务会覆盖packageBin创建的JAR.我尝试覆盖packageBin的定义,以便它使用osgi-bundle任务而不是默认任务:
packageBin in Compile <<= OsgiKeys.bundle
Run Code Online (Sandbox Code Playgroud)
这导致了循环引用:
[error] Cyclic reference involving
[error] {file:project/*:osgi-bundle
[error] {file:project/compile:full-classpath
[error] {file:project/compile:exported-products
[error] {file:project/compile:package-bin
Run Code Online (Sandbox Code Playgroud)
我对SBT很新,我不知道从哪里开始.任何帮助,将不胜感激.
我正在尝试为scodec库编写一个组合器,它将Codec[K]in转换为Codec[L]where K是a HList并且与删除的所有元素L等效.HListUnit
实现解码可以通过解码a K然后过滤掉所有Unit元素来完成.过滤掉Unit元素直接由无形使用支持filterNot,这使得实现这一点变得微不足道.
实现编码是通过将La 转换为a K,()在适当的索引处插入,然后委托给原始代码来完成的Codec[K].我在实现L => K转换时遇到了麻烦.
def dropUnits[K <: HList, L <: HList](codec: Codec[K])(
implicit fltr: FilterNot.Aux[K, Unit, L]): Codec[L] = new Codec[L] {
override def decode(buffer: BitVector) =
codec.decode(buffer).map { case (rest, l) => (rest, l.filterNot[Unit]) }
override def encode(xs: L) = {
???
}
}
Run Code Online (Sandbox Code Playgroud)
没有运气,我尝试了几种不同的解决方案.这可能是无形的吗?