当我尝试使用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
但是它与示例中的相同,这段代码有什么不好?
答案 0 :(得分:1)
您可以将<=<
读作“之后”。然后
idLens <=< nameLens
表示:在idLens
之后使用nameLens
。为此,idLens
(Person
)的“输入类型”必须与nameLens
的“输出类型”匹配。这就是编译器期望LensFamily[?,?,Person,Person]
(即输出类型Person
)的原因。但nameLens
的输出类型为String
,而不是Person
。
您期望c
有哪种类型?如果您需要Person @> (Int, String)
,请使用并行组合:
val c = idLens *** nameLens