2017-11-07 26 views
0

これはmy previous questionのフォローアップです。HList foldRightは機能していますが、foldLeftはコンパイルされません。

したがって、私はオプションの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] 

私は何をしないのですか?

N.B.私は使用することを知っているfoldLeftfoldRightと同じ結果を得るために、それぞれHListを最終的に逆にする必要がありますが、今私は実際には最初のHListを左折することに興味があります。私は一度取得した出力を修正します:)

答えて

2

FoldLeftは異なる順序で引数をとります。 Case.Aux[List[B], Option[A], ...]を定義する必要があります。私が試したことを誓った

foldr

foldl

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

+1

まあ、私が持っている可能性がありますが、明らかに私はしませんでした。それは本当に私の問題を解決しました。ありがとう – mdm

関連する問題