如果为了理解给出了类型注释,则 scalaz 析取会出错

scalaz's disjuntion gives error if type annotation is given in for comprehensin

如果我在下面的 for comprehension 中为 v1_b 提供类型注释,Scalaz 想要一个 Monoid 实例。

1) 为什么会这样?

2) 错误中也提到了filterfilter是怎么出现在这张图里的?

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)

在此 fiddle 中在线尝试此代码:https://scalafiddle.io/sf/DHO6xki/3

v1_b : String 在运行时执行类型测试。因此,这个 for 理解的脱糖包含 filter (以过滤掉测试失败的情况)。 filter on \/ 要求左边是幺半群。