如果为comprehensin给出了类型注释,则scalaz的disjuntion会给出错误

时间:2017-05-18 20:41:03

标签: scala scalaz for-comprehension

如果我在下面的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)

在这个小提琴中在线试用此代码:https://scalafiddle.io/sf/DHO6xki/3

1 个答案:

答案 0 :(得分:4)

v1_b : String在运行时执行类型测试。因此,这种for理解的贬值中有filter(以便在测试失败时过滤掉案例)。 filter on \/要求左侧为幺半群。