Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cats.data.ValidatedNel issue #3345

Open
kevingomu opened this issue Mar 6, 2020 · 1 comment
Open

cats.data.ValidatedNel issue #3345

kevingomu opened this issue Mar 6, 2020 · 1 comment

Comments

@kevingomu
Copy link

kevingomu commented Mar 6, 2020

Hi all,

I am trying to run docker:publishLocal where I am faced with this error:


[error] /path/to/ClassA.scala:60:8: Cannot prove that cats.data.ValidatedNel[String,path.to.classB] <:< G[A].
[error]       .sequence
[error]        ^

Class A resides in project A, and classB is in project B, and they have this kind of structure:

|--projectName
        |-----project A
        |-----project B
|--build.sbt

The build.sbt looks like this:


lazy val projectA =
  project
    .in(file("projectName/projectA"))
    .enablePlugins(JavaAppPackaging, DockerPlugin)
    .dependsOn(ProjectRef(file("."), "projectB"))
    .settings(
        libraryDependencies ++= Seq("org.typelevel" %% "cats-core" % 2.1.0),
        scalacOptions += "-Ypartial-unification"
        ...
    )

lazy val projectB =
  project
    .in(file("projectName/projectB"))
    .dependsOn(ProjectRef(file("."), "anotherProject"))
    ...

I have researched around and I have added stuff like the "-Ypartial-unification", but to no avail:

plugins.sbt has this:

addSbtPlugin("org.lyranthe.sbt" % "partial-unification" % "1.1.2")
The method that is throwing the error is:


def apply(v1: (crwm, icrwm)): Boolean = {
    val (_, cri) = v1

    validationCriteria
      .map(_.validate(cri))
      .sequence
      .map(_ => cri)
      .toEither
      .fold(validationErrors => {
        log.warn(s"""
             |CR didn't pass quality check(s):
             |${validationErrors.toList.mkString("\n")}
           """.stripMargin)
        false
      }, _ => true)
  }

Sorry I have to obfuscate the methods. If it is unclear, please let me know and I will provide any info that I could.

I'm running sbt version 1.2.7

Thank you so much.

@ybasket
Copy link
Contributor

ybasket commented Mar 8, 2020

@kevingomu I doubt this problem has something to do with your project set up, it rather looks like your types don't work out. Unfortunately, your example code lacks important type information, so it's hard to help you based on this. I recommend extracting a minimal working (=reproducing behavior) example when you ask for help. That can be a little tricky, but often you'll find the fix for your problem while doing that already and if not, people can help you way more concrete.

Taking your example code and some guesses on what types you have there, I get the following snippet working nicely:

// Assuming you have some collection of checks you want to combine
val validationCriteria: List[Int => ValidatedNel[String, Int]] = List(
  i => Validated.condNel(i > 5, i, "Too small")
  // i => ...
)

val cri = 7 // Dummy input

validationCriteria
  .map(_.apply(cri)) // assuming your .validate takes the cri and produces a ValidatedNel
  .sequence // List[ValidatedNel[Error, SomeType]] => ValidatedNel[Error, List[SomeType]], can be combined with the previous .map to .traverse
  .map(_ => cri) // can be written as .as(cri), but seems unused anyway
  .toEither // unnecessary, Validated(Nel) has a .fold
  .fold(_ => false, _ => true) // simplified for readability

Maybe that helps you already. If not, please provide more details. The Gitter channel is btw a place where can get answers more quickly, plenty of helpful folks there. And we even have some docs on this topic: https://typelevel.org/cats/datatypes/validated.html#parallel-validation

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants