来自示例的scalaz镜头不起作用

时间:2017-10-04 19:34:25

标签: scalaz

当我尝试使用Lens.lensu中的scalaz.7.2.15时,(我检查http://eed3si9n.com/learning-scalaz/Lens.html

case class Person(id: Int, name: String)

val idLens: Person @> Int = Lens.lensu(
  (p, id) => p.copy(id = id),
  _.id
)
val nameLens: Person @> String = Lens.lensu(
  (p, name) => p.copy(name = name),
  _.name
)

val c = idLens <=< nameLens

但我得到错误:

found   : Person @> String
[error]     (which expands to)   scalaz.LensFamily[Person,Person,String,String]
[error]  required: scalaz.LensFamily[?,?,Person,Person]
[error]     val c = idLens <=< nameLens

但是它与示例中的相同,这段代码有什么不好?

1 个答案:

答案 0 :(得分:1)

您可以将<=<读作“之后”。然后

idLens <=< nameLens

表示:在idLens之后使用nameLens。为此,idLensPerson)的“输入类型”必须与nameLens的“输出类型”匹配。这就是编译器期望LensFamily[?,?,Person,Person](即输出类型Person)的原因。但nameLens的输出类型为String,而不是Person

您期望c有哪种类型?如果您需要Person @> (Int, String),请使用并行组合:

val c = idLens *** nameLens