3

Validation を Monoid/SemiGroup として使用できるという印象を受けました。scala 2.9.2 および scalaz 7 スナップショットで次のコードを試しました。

import scalaz._
import Scalaz._

val success1 = 1.success
val success2 = 2.success

val failureA = "A".fail
val failureB = "B".fail

success1 |+| success2
<console>:16: error: diverging implicit expansion for type scalaz.Semigroup[scalaz.Validation[Nothing,Int]]
starting with method validationSemigroup in trait ValidationInstances
              success1 |+| success2
              ^
<console>:16: error: value |+| is not a member of scalaz.Validation[Nothing,Int]

              success1 |+| success2

私は期待していたSuccess(3)

それから

failureA |+| failureBres1: scalaz.Validation[java.lang.String,Nothing] = Failure(AB) 期待通りに与える

success1 |+| failureA期待どおりに失敗します

<console>:16: error: diverging implicit expansion for type scalaz.Semigroup[scalaz.Validation[Nothing,Int]]
starting with method validationSemigroup in trait ValidationInstances
              success1 |+| failureA
              ^
<console>:16: error: value |+| is not a member of scalaz.Validation[Nothing,Int]

              success1 |+| failureA

なぜ動作|+|Successないのですか?それはバグですか、それともここで何かを見逃しましたか

4

1 に答える 1

3

それはこのように動作します:

scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._

scala> val success1 = 1.success[String]
success1: scalaz.Validation[String,Int] = Success(1)

scala> val success2 = 2.success[String]
success2: scalaz.Validation[String,Int] = Success(2)

scala> val failureA = "A".fail[Int]
failureA: scalaz.Validation[java.lang.String,Int] = Failure(A)

scala> val failureB = "B".fail[Int]
failureB: scalaz.Validation[java.lang.String,Int] = Failure(B)

scala> success1 |+| success2
res0: scalaz.Validation[String,Int] = Success(1)

scala> failureA |+| failureB
res1: scalaz.Validation[java.lang.String,Int] = Failure(AB)

scala> success1 |+| failureA
res2: scalaz.Validation[String,Int] = Success(1)

Failure最初の 2 つの で左要素 ( )のタイプを指定しませんでしたvalNothingと推測されたのはそのためです。どうやら、左の要素が( is not, is) の場合Validation、インスタンスがあります。これがインスタンスです。SemigroupSemigroupNothingString

UPD:また、ご覧のとおり、 'esインスタンスを使用する代わりに、Semigroupインスタンスが最初に取得されます。なるほど、 にはメソッドがあり、左右の要素の両方がs である必要があり、両方のインスタンスを使用します。SuccessSuccessSemigroupappendValidationSemigroup

scala> success1 append success2
res6: scalaz.Validation[String,Int] = Success(3)

ValidationなぜのSemigroupインスタンスで使用されないのかわかりません。この動作を変更するプル リクエストを作成しました。

于 2012-07-07T20:50:41.013 に答える