1

との実際の違いを理解できませSemigroupal.productSemigroupal.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)
    )
  }

両方とも無効bothInvalidbothInvalidTuple、同じ結果が得られます。有効な値を使用すると、最初の値のみがコンパイルされます。私が得ているエラー:

エラー:(40, 23) パラメータ semigroupal の暗黙の値が見つかりませんでした:cats.Semigroupal[[+A]cats.data.Validated[Nothing,A]] Semigroupal.tuple2(

(私が間違っていなければ) Scala はMonoid結合を見つけようとしますNothingが、そうではないようList[String]です。で動作させる方法はtuple2

4

1 に答える 1