Учитывая, что в элементе Shapeless HList, где каждый элемент списка имеет один и тот же тип конструктора, как HList может быть упорядочен?Последовательность HList
Например:
def some[A](a: A): Option[A] = Some(a)
def none[A]: Option[A] = None
val x = some(1) :: some("test") :: some(true) :: HNil
val y = sequence(x) // should be some(1 :: "test" :: true :: HNil)
def sequence[L <: HList : *->*[Option]#λ, M <: HList](l: L): Option[M] =
???
Я пытался реализовать последовательность так:
object optionFolder extends Poly2 {
implicit def caseOptionValueHList[A, B <: HList] = at[Option[A], Option[B]] { (a, b) =>
for { aa <- a; bb <- b } yield aa :: bb
}
}
def sequence[L <: HList : *->*[Option]#λ, M <: HList](l: L): Option[M] = {
l.foldRight(some(HNil))(optionFolder)
}
Но это не компилируется:
could not find implicit value for parameter folder: shapeless.RightFolder[L,Option[shapeless.HNil.type],SequencingHList.optionFolder.type]
Любые советы по реализации этого для либо конкретный пример, например Option или для произвольного аппликативного?
Спасибо! Я попытался предоставить неявный RightFolder перед публикацией, но столкнулся с точной ошибкой, о которой вы указали выше (требуется 'F [M]', но найден 'folder.Out'). RightFolderAux делает это понятным. – mpilquist
Я просто попробовал реализацию последовательности с Shapeless 2.0 и получил эту ошибку: Ошибка: (41, 36) не удалось найти неявное значение для папки параметров: shapeless.ops.hlist.RightFolder [L, Option [shapeless.HNil], optionFolder. тип] l.foldRight (опция (HNil: HNil)) (опцияFolder) ^ –
@ChanningWalton: Есть ли ошибка перед этим? Вы импортировали 'shapeless.ops.hlist.RightFolder'? Это работает для меня в 2.0.0. –