簡體   English   中英

HList foldRight正在工作,但是foldLeft無法編譯

[英]HList foldRight is working, but foldLeft does not compile

這是我以前的問題的跟進。

因此,我正在嘗試計算選項HList的(種類) 功率集。 基本上,我想將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 一旦得到輸出,我將修復輸出:)

FoldLeft以不同的順序接受參數。 您應該定義Case.Aux[List[B], Option[A], ...]

文件夾

折頁

https://zh.wikipedia.org/wiki/Fold_(高級功能)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM