scalaz - Is Validation a SemiGroup/Monoid : using |+| does not work -
i uder impression validation used monoid/semigroup tried following code under scala 2.9.2 , scalaz 7 snapshot
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 type scalaz.semigroup[scalaz.validation[nothing,int]] starting method validationsemigroup in trait validationinstances success1 |+| success2 ^ <console>:16: error: value |+| not member of scalaz.validation[nothing,int] success1 |+| success2 i expecting success(3)
then
failurea |+| failureb gives res1: scalaz.validation[java.lang.string,nothing] = failure(ab) expected
and
success1 |+| failurea fails expected with
<console>:16: error: diverging implicit expansion type scalaz.semigroup[scalaz.validation[nothing,int]] starting method validationsemigroup in trait validationinstances success1 |+| failurea ^ <console>:16: error: value |+| not member of scalaz.validation[nothing,int] success1 |+| failurea why |+| on success not work ? bug or did miss here
it works this:
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) you did not specify type of left element (failure) in first 2 val's. why nothing inferred. apparently, validation has semigroup instance if left element semigroup (nothing not, string is). here's instance.
upd: also, see, semigroup instance gets first success instead of using success'es semigroup instance. see, there method append in validation, requires both left , right elements semigroups , uses both instances:
scala> success1 append success2 res6: scalaz.validation[string,int] = success(3) don't know, why not used in validation's semigroup instance. created pull request change behavior.
Comments
Post a Comment