Tidak dapat memahami perbedaan sebenarnya antara Semigroupal.product dan Semigroupal.tuple2. Berikut adalah contoh singkatnya:

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)
    )
  }

Dengan invalid baik bothInvalid dan bothInvalidTuple memberikan hasil yang sama. Dengan nilai yang valid, hanya yang pertama yang dikompilasi. Kesalahan yang saya dapatkan:

Kesalahan:(40, 23) tidak dapat menemukan nilai implisit untuk parameter semigroupal: cats.Semigroupal[[+A]cats.data.Validated[Nothing,A]] Semigroupal.tuple2(

Sepertinya (jika saya tidak salah) Scala mencoba menemukan Monoid untuk menggabungkan Nothing, tetapi tidak List[String]. Bagaimana cara membuatnya bekerja dengan tuple2?

1
Alexandr 11 Maret 2019, 17:22

1 menjawab

Jawaban Terbaik

Hanya beberapa obat generik yang tidak disimpulkan. Cobalah untuk menentukannya secara eksplisit

  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)
    )
  }
1
Dmytro Mitin 12 Maret 2019, 09:18