/ / disjuntion skalaza daje błąd, jeśli adnotacja typu jest podana w celu zrozumienia - scala, scalaz, for-understand

odmiana skalaza daje błąd, jeśli adnotacja typu jest podana w celu zrozumienia - scala, scalaz, for-understand

Scalaz chce instancji Monoid, jeśli podaję adnotację typu v1_b w celu zrozumienia poniżej.

1) Dlaczego tak jest?

2) Błąd wspomina również filter , jak filter wejść w to zdjęcie?

import scalaz._
import Scalaz._

case class MyError(s:String)

type Err=MyError
val v1: /[Err, String] = "cool".right
val v2: /[Err, String] = MyError("not cool").left[String]

val res: /[Err, (String,String)] =for {
v1_a <- v1 // this works fine

// v1_b : String <- v1
// uncommenting the line above gives the following compiler error:
// Error:(23, 22) could not find implicit value for parameter M: scalaz.Monoid[_experiment.scalaz.Disjunction.Err]
// Error:(23, 22) not enough arguments for method filter: (implicit M: scalaz.Monoid[_experiment.scalaz.Disjunction.Err])scalaz./[_experiment.scalaz.Disjunction.Err,String].
// Unspecified value parameter M.

v2_ <- v2
} yield (v1_a,v2_)

println(res)

Wypróbuj ten kod online w tym skrzypcach: https://scalafiddle.io/sf/DHO6xki/3

Odpowiedzi:

4 dla odpowiedzi № 1

v1_b : String wykonuje test typu w czasie wykonywania. Dlatego usunięcie tego for zrozumienie ma filter w nim (aby odfiltrować przypadki, gdy test się nie powiedzie). filter na / Wymaga, aby lewa strona była monoidem.