2013-09-16 5 views
5

Scalaz지도 렌즈 here의 예가 있습니다. Dan Burton은 containsKey이라고 부르며 Edward Kmett 토크에서 영감을 받았습니다. Scalaz 7에 mapVPLens이라는 이름이 있는데지도의 값을 수정하는 데 유용합니다.Scalaz : 가치 렌즈로지도 렌즈를 작성하는 방법은 무엇입니까?

제 질문은 : V 유형의 렌즈와 Map[K,V]의 렌즈를 가지고 있다면 어떻게 구성 할 수 있습니까? 나는 간단한 예제를 위해 잠시 동안 검색을 해왔지만, Scalaz에는 예제가 부족합니다.

Scalaz 6 및 Scalaz 7 솔루션에 모두 관심이 있습니다. 당신은지도 렌즈 구성하려는 렌즈 부분 렌즈 인 경우

답변

8

, 당신은 단지 compose 사용할 수 있습니다

import scalaz._, Scalaz._, PLens._ 

def headFoo[A] = listHeadPLens[A] compose mapVPLens("foo") 

: 그리고

scala> headFoo.get(Map("foo" -> List(42))) 
res0: Option[Int] = Some(42) 

scala> headFoo.get(Map("foo" -> Nil)) 
res1: Option[Nothing] = None 

scala> headFoo.get(Map("bar" -> List(13))) 
res2: Option[Int] = None 

참고이 Scalaz입니다 7.

작성하려는 렌즈가 부분적이지 않은 경우 ~ :

scala> def firstFoo[A, B] = ~Lens.firstLens[A, B] compose mapVPLens("foo") 
firstFoo: [A, B]=> scalaz.PLensFamily[Map[String,(A, B)],Map[String,(A, B)],A,A] 

scala> firstFoo.get(Map("foo" -> (42, 'a))) 
res6: Option[Int] = Some(42) 

단항 연산자가 마음에 들지 않으면 .partial 메소드가 있습니다.

+0

감사합니다. 훌륭한 답변입니다. 마침내 렌즈 구성이 내 응용 프로그램과 함께 작동하게됩니다. 많은 컴파일 타임 논쟁과 런타임 논쟁이 없습니다! –

+0

요약하면, 속임수는지도를 다룰 때 값 렌즈에'.partial '을 추가하는 것입니다. –