如果我在下面的for comprehension中为v1_b
提供类型注释,Scalaz想要一个Monoid实例。
1)为什么会这样?
2)错误还提到filter
,filter
如何进入这张图片?
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)
在这个小提琴中在线试用此代码:https://scalafiddle.io/sf/DHO6xki/3
答案 0 :(得分:4)
v1_b : String
在运行时执行类型测试。因此,这种for
理解的贬值中有filter
(以便在测试失败时过滤掉案例)。 filter
on \/
要求左侧为幺半群。