シェイプレスな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)
}
しかし、それはコンパイルされません:Aのいずれかのためにこれを実装する上
could not find implicit value for parameter folder: shapeless.RightFolder[L,Option[shapeless.HNil.type],SequencingHList.optionFolder.type]
任意のヒントOptionのような具体的な例や、任意のApplicativeについて?
あなたはかなり近い、あなたはちょうどあなたがそれが求めていたという証拠の余分なビットを持っていることを確認する必要がありました
ありがとうございます!私は投稿する前に暗黙の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))(optionFolder) ^ –
@ChanningWalton:その前にエラーがありますか? 'shapeless.ops.hlist.RightFolder'をインポートしましたか?それは2.0.0で私のために働く。 –