【问题标题】:HList foldRight is working, but foldLeft does not compileHList foldRight 正在工作,但 foldLeft 无法编译
【发布时间】:2017-11-08 02:57:37
【问题描述】:

这是对my previous question的跟进。

所以,我正在尝试计算选项 HList 的(种类)powerset。基本上,我想将 HList 解释为一个集合,在这种情况下,一个元素的 Option 值告诉我它是否属于该集合。

我能够使用以下代码做我需要的事情:

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)
    }
  }

所有这一切都适用于foldRight

val h1 = Some(2) :: none[BigDecimal] :: Some("b") :: HNil
h1.foldRight(List(HNil))(combine1).foreach(println)

打印:

// None :: None :: None :: HNil
// Some(2) :: None :: None :: HNil
// None :: None :: Some(b) :: HNil
// Some(2) :: None :: Some(b) :: HNil

但是,foldLeft 不起作用。这是为什么呢?

h1.foldLeft(List(HNil))(combine1).foreach(println)

结果如下:

Error:(72, 26) could not find implicit value for parameter folder: shapeless.ops.hlist.LeftFolder[Some[Int] :: Some[Unit] :: Some[String] :: shapeless.HNil,List[shapeless.HNil.type],swaps.tec.util.Experiment.combine1.type]

我错过了什么?

注意我知道要使用foldLeft,我最终需要反转每个HList 以获得与foldRight 相同的结果,但现在我只对实际左折叠初始HList 感兴趣。一旦我得到一个,我将修复输出输出:)

【问题讨论】:

    标签: scala implicit shapeless


    【解决方案1】:

    FoldLeft 以不同的顺序接受参数。你应该定义Case.Aux[List[B], Option[A], ...]

    https://en.wikipedia.org/wiki/Fold_(higher-order_function)

    【讨论】:

    • 好吧,我可以发誓我试过了,但显然我没有。那确实解决了我的问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多