选项HList的Powerset

时间:2017-11-07 12:57:57

标签: scala implicit shapeless implicits

我正在玩Shapeless,我正在尝试计算HList Option的{​​{1}}个powerset。基本上,我想将HList解释为一个集合,在这种情况下,元素的Option值告诉我它属于集合。

例如,给定Some(5) :: Some("a") :: HNil,我想获得以下HList s:

Some(5) :: Some("a") :: HNil
Some(5) :: None :: HNil
None :: Some("a") :: HNil
None :: None :: HNil

我尝试了以下内容:

object test2 extends Poly2{
  implicit def someA[A,B <: HList] : Case.Aux[Some[A], List[B], List[Option[A] :: B]] = at{(a, hls) =>
    val x: List[Option[A] :: B] = hls.flatMap{ hl =>
      List(
        a :: hl,
        None :: hl
      )
    }
    x
  }
  implicit val none : Case.Aux[None.type, List[HList], List[HList]] = at{(_, hls) =>
    hls.map(hl => None :: hl)
  }
}

h.foldRight(List(HNil))(test2)

没有成功。我在foldRight

得到了一个失败的隐式解决方案
Error:(36, 25) could not find implicit value for parameter folder: shapeless.ops.hlist.RightFolder[Some[Int] :: None.type :: shapeless.HNil,List[shapeless.HNil.type],A$A8.this.test2.type]
h.foldRight(List(HNil))(test2);}
                       ^

我开始认为我想要的东西在Shapeless中是不可能/没有意义的,因为Some[A]None是不同的类型,我试图将它们混合起来,就像它们不是(例如List[Option[A] :: B]中的someA,但我很高兴被证明是错的。 :)

更新至初始问题:

感谢@ Marth的评论,我意识到我的代码工作正常,只要我没有使用IntelliJ Scala工作表!我使用普通object并且它起作用了。
另外,我需要为Poly Option[A]添加一个案例。最终代码如下:

object combine1 extends Poly2{
    implicit def optionA[A,B <: HList] : Case.Aux[Option[A], List[B], List[Option[A] :: B]] = at{(a, hls) =>
      val x: List[Option[A] :: B] = hls.flatMap{ hl => a match {
          case Some(_) =>
            List(
              None :: hl,
              a :: hl,
            )
          case None =>
            List(None :: hl)
        }
      }
      x
    }

    implicit def someA[A,B <: HList] : Case.Aux[Some[A], List[B], List[Option[A] :: B]] = at{(a, hls) =>
      val x: List[Option[A] :: B] = hls.flatMap{ hl =>
        List(
          None :: hl,
          a :: hl
        )
      }
      x
    }

    implicit val none : Case.Aux[None.type, List[HList], List[HList]] = at{(_, hls) =>
      hls.map(hl => None :: hl)
    }
  }

0 个答案:

没有答案