2017-10-04 15 views
0

작동하지 않습니다 (내가 http://eed3si9n.com/learning-scalaz/Lens.html 확인)scalaz 렌즈,

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 

의미 : nameLens 후 사용 idLens. 이 작업을 위해, idLens의 "입력 타입"(Person 임) nameLens의 "출력 종류"와 일치한다. 이것이 컴파일러가 LensFamily[?,?,Person,Person] (즉, 출력 유형 Person)을 필요로하는 이유입니다. 그러나 nameLens의 출력 유형은 String하지 Person입니다.

당신이 c이있을 것으로 예상 할 어떤 종류의

?

val c = idLens *** nameLens 
+0

아하, 이것이 나의 실패했습니다 감사 : 당신이 Person @> (Int, String)를 원한다면, 병렬 구성을 사용 – lito