def parse[T <: HList](list: List[String]): Validation[T]
を書きたいと思います。 list
はList("fooid", "barid")
、T
FooId :: BarId :: HNil
、Parse[T]
はString => Validation[FooId]
を実装するtypeclassとすることができます。どのようにしてparse
と書いたら、リストをT
に解析しますか? T
の各要素の暗黙的な型式を呼び出す方法がわかりません。リストをHListに解析する
1
A
答えて
2
shapeless.ops.traversable.FromTraversable
からコードを適合させることができます。
私はあなたのValidation
タイプが何であるかわからないんだけど、私は(主にので、私は簡単に私にいくつかのParse
インスタンスを与えることstring
構文を使用することができます)以下scalaz.ValidationNel[String, A]
のエイリアスとしてそれを使用。 Parser
型クラスは、ソートして
import scalaz.{Validation => _, _}, Scalaz._
type Validation[A] = ValidationNel[String, A]
trait Parse[T] {
def apply(s: String): Validation[T]
}
object Parse {
def fromScalazParse[E <: Exception, T](f: String => scalaz.Validation[E, T]) =
new Parse[T] {
def apply(s: String): Validation[T] =
f(s).leftMap(_.getMessage).toValidationNel
}
implicit val booleanParse = fromScalazParse(_.parseBoolean)
implicit val intParse = fromScalazParse(_.parseInt)
implicit val doubleParse = fromScalazParse(_.parseDouble)
}
、我々は今List[String]
を解析し、私たちに与えることをFromTraversable
に基づいて型クラスを作成することができValidation[A :: B :: HNil]
:私たちはFromTraversableParsed
を使用して作るために、いくつかの構文を追加することができます
import shapeless._
import scala.collection.GenTraversable
trait FromTraversableParsed[Out <: HList] extends Serializable {
def apply(l: GenTraversable[String]) : Validation[Out]
}
object FromTraversableParsed {
def apply[Out <: HList](implicit from: FromTraversableParsed[Out]) = from
implicit val hnilFromTraversableParsed =
new FromTraversableParsed[HNil] {
def apply(l: GenTraversable[String]): Validation[HNil] =
if(l.isEmpty) HNil.successNel[String]
else "Traversable is not empty".failureNel[HNil]
}
implicit def hlistFromTraversableParsed[OutH, OutT <: HList](implicit
ftpT: FromTraversableParsed[OutT],
parseH: Parse[OutH]
): FromTraversableParsed[OutH :: OutT] =
new FromTraversableParsed[OutH :: OutT] {
def apply(l : GenTraversable[String]) : Validation[OutH :: OutT] =
if(l.isEmpty) "Empty traversable".failureNel[OutH :: OutT]
else (parseH(l.head) |@| ftpT(l.tail))(_ :: _)
}
}
もう少し簡単にできます:
implicit class ParseStringListOps(val strings: List[String]) extends AnyVal {
def parse[L <: HList](implicit ftp: FromTraversableParsed[L]): Validation[L] =
ftp(strings)
}
今すぐできる:
List("1", "true", "3.0").parse[Int :: Boolean :: Double :: HNil]
// Validation[Int :: Boolean :: Double :: HNil] = Success(1 :: true :: 3.0 :: HNil)
関連する問題
- 1. XMLをJavaリストに解析する
- 2. URLをリストに解析する
- 3. リストにcsvを解析するpython
- 4. snakeyamlで豆のリストを解析する
- 5. URLリストからxmlを解析する
- 6. python3でリストを解析する方法
- 7. djangoテンプレートのリストのリストを解析するには?
- 8. Python:リストのリストに論理文字列を解析する
- 9. Zip generic HList with static Nat HList
- 10. Slick HLISTから要素を取得する(またはSlick HLIstをシェープレスHListに変換する)
- 11. HListのこの定義の理解
- 12. ハイチャートデータ解析一覧リスト
- 13. 解析のJSONリスト、キルケ
- 14. Python:jsonリストの構文解析
- 15. pythonのリスト解析の例
- 16. アンドロイドGson解析リストのフィールド
- 17. リストのリストへのデータの解析
- 18. Pythonリストの理解とJSONの解析
- 19. icalファイルを解析し、イベントをリストにエクスポートするには?
- 20. URLのファイルをPythonのリストに解析するには?
- 21. バイナリ要素を持つデータをPythonのリストのリストに解析するには?
- 22. HListをシーケンス化する
- 23. PHPをネストされたリストにXMLを構文解析する
- 24. menhirを使って式のリストを解析するには?
- 25. JSON文字列をRリストに解析する
- 26. リストを使ってPythonのhtml解析データにアクセスする
- 27. リストを解析するか、BeautifulsoupのFlaskに書き込む
- 28. R HTMLをリストに読み込んで構文解析する
- 29. XMLファイルをリストに解析する方法は?
- 30. 解析中にリスト全体を反復する
ありがとうございます。 gitterチャンネルでは、https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/ops/hlists.scala#L2815について言及しましたが、それを使用することは可能でしょうか?自分のTCを書くのをスキップしますか? – Reactormonk
私は 'LiftAll'はParse [Int] :: Parse [Boolean] :: Parse [Double] :: HNil'を与えることができると思いますが、これを使って' List [String] '? –
'List [String] => String :: String :: String :: HNil'の行に沿って何かを見つけ出し、' LiftAll'の 'HList'を使ってそれを詰め、それを検証してトラバースします。 – Reactormonk