Использование Утверждено из библиотеки Cats в Scala - PullRequest
1 голос
/ 11 марта 2019

Невозможно понять фактическую разницу между Semigroupal.product и Semigroupal.tuple2.Вот краткий пример:

import cats.Semigroupal
import cats.data.Validated
import cats.data.Validated.Invalid
import cats.instances.list._ // for Monoid

  type AllErrorsOr[A] = Validated[List[String], A]
  def bothInvalid = {
    Semigroupal[AllErrorsOr].product(
      Validated.invalid(List("Error 1")),
      Validated.invalid(List("Error 2"))
    )
  }

  def bothInvalidTuple = {
    Semigroupal.tuple2(
      Validated.invalid(List("Error 1")),
      Validated.invalid(List("Error 2"))
    )
  }

  def bothValid = {
    Semigroupal[AllErrorsOr].product(
      Validated.valid(10),
      Validated.valid(20)
    )
  }

  def bothValidTuple = {
    Semigroupal.tuple2(
      Validated.valid(10),
      Validated.valid(20)
    )
  }

Для инвалидов bothInvalid и bothInvalidTuple дают одинаковый результат.С допустимыми значениями компилируется только первое.Я получаю ошибку:

Ошибка: (40, 23) не удалось найти неявное значение для параметра полугруппового: cats.Semigroupal [[+ A] cats.data.Validated [Nothing, A]]Semigroupal.tuple2 (

Кажется (если я не ошибаюсь) Scala пытается найти Monoid для объединения Nothing, но не List[String]. Как заставить работать это с tuple2

1 Ответ

1 голос
/ 12 марта 2019

Просто некоторые дженерики не были выведены. Попробуйте указать их явно

  type AllErrorsOr[A] = Validated[List[String], A]

  def bothInvalid: AllErrorsOr[(Int, Int)] = {
    Semigroupal[AllErrorsOr].product[Int, Int](
      Validated.invalid(List("Error 1")),
      Validated.invalid(List("Error 2"))
    )
  }

  def bothInvalidTuple: AllErrorsOr[(Int, Int)] = {
    Semigroupal.tuple2[AllErrorsOr, Int, Int](
      Validated.invalid(List("Error 1")),
      Validated.invalid(List("Error 2"))
    )
  }

  def bothValid: AllErrorsOr[(Int, Int)] = {
    Semigroupal[AllErrorsOr].product[Int, Int](
      Validated.valid(10),
      Validated.valid(20)
    )
  }

  def bothValidTuple: AllErrorsOr[(Int, Int)] = {
    Semigroupal.tuple2[AllErrorsOr, Int, Int](
      Validated.valid(10),
      Validated.valid(20)
    )
  }
...