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

Popular posts from this blog

java - Play! framework 2.0: How to display multiple image? -

gmail - Is there any documentation for read-only access to the Google Contacts API? -

php - Controller/JToolBar not working in Joomla 2.5 -