2017-11-07 7 views
0

다음은 my previous question의 후속 조치입니다.HList foldRight가 작동하지만 foldLeft가 컴파일되지 않습니다.

그래서 저는 HList of Options의 powerset (kind-of)을 계산하려고합니다. 기본적으로 HList를 세트로 해석하려고합니다.이 경우 요소의 Option 값은 세트에 속하는지 여부를 알려줍니다. , 그러나

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

:

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) 

인쇄를

은 내가 다음 코드를 사용하여 무엇을해야 할 수 있었다 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. 나는 foldLeft을 사용하기 위해 결국 과 같은 결과를 얻으려면 각 HList을 뒤집을 필요가 있지만, 지금은 실제로 왼쪽으로 접히는 데에만 관심이 있습니다. HList. 일단 출력을 얻으면 출력을 수정합니다.

답변

2

FoldLeft는 다른 순서로 인수를 취합니다. Case.Aux[List[B], Option[A], ...]을 정의해야합니다. 나는 것을 시도 맹세

foldr

foldl

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

+1

글쎄, 내가 가질 수 있지만, 분명히 나는하지 않았다. 그것은 실제로 내 문제를 해결했습니다. 감사 – mdm

관련 문제