との実際の違いを理解できませ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) パラメータ semigroupal の暗黙の値が見つかりませんでした:cats.Semigroupal[[+A]cats.data.Validated[Nothing,A]] Semigroupal.tuple2(
(私が間違っていなければ) Scala はMonoid
結合を見つけようとしますNothing
が、そうではないようList[String]
です。で動作させる方法はtuple2
?