簡體   English   中英

Scala:如何將ValidatedNel的HList轉換為HList的ValidatedNel

[英]Scala: How to transform an HList of ValidatedNel into a ValidatedNel of HList

我一直在成功使用cats.data.Validated解決以下問題,但是使用我現有的解決方案解決了一個包含22個以上成員的case類的問題(因為無法將構造方法構造為Function )。

這是我的目標:生成一堆ValidatedNel[E, T] ,將它們排序為ValidatedNel[E, (T1, T2, ...)] ,然后是mapN(DAOClass) (其中DAOClass是具有指定條件的case class參數)。 此方法適用於少於22個參數,但由於兩個問題而失敗了,但失敗了:

  1. (T1, T2, ...)不能有超過22個組件
  2. DAOClass.apply無法轉換為Function

因此,我正在研究使用shapeless.HList處理第1部分並遇到問題。 我應該能夠使用Generic[DAOClass]滿意地處理第2部分,否則,如果不起作用,請使用可擴展的記錄 ,並增加一些樣板。

這是一些小的示例代碼(不包含22個組件):

package example

import cats.syntax.validated._
import cats.data.ValidatedNel
import cats.sequence._
import shapeless._

case class DAOClass(a: Int, b: Int)

object DAOClass {

  def generate: ValidatedNel[String, DAOClass] = {

    val hlist: ValidatedNel[String, Int] :: ValidatedNel[String, Int] :: HNil =
      1.validNel :: 2.validNel :: HNil

    val hlistSequence: ValidatedNel[String, Int :: Int :: HNil] = hlist.sequence

    hlistSequence.map(Generic[DAOClass].from)

  }

}

這使用kittens庫對HList

不幸的是,這給了我一個編譯錯誤:

[error] ...src/main/scala/example/DAOClass.scala:17:73: cannot construct sequencer, make sure that every item of your hlist shapeless.:: [cats.data.ValidatedNel[String,Int],shapeless.::[cats.data.ValidatedNel[String,Int],shapeless.HNil]] is an Apply
[error]     val hlistSequence: ValidatedNel[String, ::[Int, ::[Int, HNil]]] = hlist.sequence
[error]                                                                             ^

我已經將其提取到一個測試項目中; 這是我的build.sbt

lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      organization := "com.example",
      scalaVersion := "2.12.6",
      version      := "0.1.0-SNAPSHOT"
    )),
    name := "shapeless-validation",
    resolvers ++= Seq(
      Resolver.sonatypeRepo("releases")
    ),
    libraryDependencies ++= Seq(
      "com.chuusai"   %% "shapeless" % "2.3.3",
      "org.scalatest" %% "scalatest" % "3.0.5" % "test",
      "org.typelevel" %% "cats-core" % "1.1.0",
      "org.typelevel" %% "kittens"   % "1.1.0"
    )
  )

我想念什么? 我是否需要在某個地方導入更多隱式內容? 有一個更好的方法嗎?

你忘了加

scalacOptions += "-Ypartial-unification"

建立build.sbt 對於cats正常工作,這通常是強制性的。

現在

hlistSequence.map(Generic[DAOClass].from)

產生一個ValidatedNel[String, DAOClass]

println(DAOClass.generate) // Valid(DAOClass(1,2))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM