2017-10-04 36 views
0

當我嘗試使用Lens.lensuscalaz.7.2.15,(我檢查http://eed3si9n.com/learning-scalaz/Lens.htmlscalaz鏡片不工作

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

您可以將<=<讀爲「之後」。然後

idLens <=< nameLens 

指:使用idLensnameLens後。爲此,idLens(即Person)的「輸入類型」必須與nameLens的「輸出類型」相匹配。這就是編譯器期望LensFamily[?,?,Person,Person](即輸出類型爲Person)的原因。但輸出類型nameLensString,而不是Person

你認爲c有什麼類型?如果你想Person @> (Int, String),然後使用並行組成:

val c = idLens *** nameLens 
+0

啊哈,謝謝這是我的失敗 – lito