있습니다 그 변종은 HList
에 HList
에서 List[Any]
을 효율적으로 계산하고 HList
을보다 정확하게 입력 한으로 변환하는 toList
메서드를 효율적으로 계산하는 runtimeList
메서드를 정의합니다.. 그럼에도 불구하고 fold
을 사용하여이 작업을 수행하는 방법을 확인하는 것은 흥미 롭습니다.
여기에는 몇 가지 주름이 있습니다. 고려해야 할 첫 번째 사항은 여기에 누적 된 List
의 유형이어야합니다. 대부분의 경우 결과 목록의 요소 유형이 접히는 HList
요소 유형의 최소 상한값 (LUB)이되도록 할 수 있습니다. 이러한 유형의 결과를 얻으려면 우리가가는 것처럼 LUB를 계산해야합니다.
또한 초기 값으로 Nil
을 수용해야합니다. Nil
은 List[Nothing]
유형의 값이며 암시 적 색인을 List[T]
으로 해결해야하는 경우 문제가됩니다. 변수 T
은 Nil
의 유형과 일치하도록 Nothing
에 인스턴스화해야하지만 불행히도 유형의 변수 값으로 Nothing
을 유형 변수로 처리합니다. 결과는 "암시 적"입니다. 거짓으로 실패합니다. 이 문제를 해결하려면 Nil.type
에 대해 foldListPoly
의 명시적인 사례를 제공해야합니다. 이러는
는
함께 우리는 각 경우에 결과리스트의 요소 유형은 HList
의 소자 종류의 LUB 것을
object wrapInList extends Poly1 {
implicit def default[T] = at[T]{v => List(v)}
}
object foldListPoly extends Poly2 {
implicit def foldToListNil[U](implicit st: wrapInList.Case.Aux[U, List[U]]) =
at[Nil.type, U]{ (acc, u) => wrapInList(u) }
implicit def foldToList[T, U, L, LL](
implicit st: wrapInList.Case.Aux[U, List[U]],
lub: Lub[T, U, L],
llub: Lub[List[T], List[U], LL],
ev: LL =:= List[L]
) = at[List[T], U]{ (acc, u) => llub.left(acc) ::: llub.right(wrapInList(u)) }
}
scala> ("aoeu" :: 42 :: HNil).foldLeft(Nil)(foldListPoly)
res0: List[Any] = List(aoeu, 42)
scala> (13 :: 23 :: HNil).foldLeft(Nil)(foldListPoly)
res1: List[Int] = List(13, 23)
scala> (23 :: true :: HNil).foldLeft(Nil)(foldListPoly)
res2: List[AnyVal] = List(23, true)
통지를 끝낸다.
오류를 추가 할 수 있습니까? –
질문이 컴파일 오류로 업데이트되었습니다. – andresrcom