2013-09-16 27 views
5

Có một ví dụ về ống kính bản đồ Scalaz here: Dan Burton gọi nó là containsKey và được lấy cảm hứng từ cuộc trò chuyện của Edward Kmett. Ngoài ra còn có một cái gì đó gọi là mapVPLens trong Scalaz 7 đó là hữu ích cho việc sửa đổi các giá trị trong một bản đồ.Scalaz: cách tạo ống kính bản đồ với ống kính giá trị?

Câu hỏi của tôi là: nếu tôi có ống kính để sửa đổi loại V và ống kính cho Map[K,V], tôi có thể soạn chúng như thế nào? Tôi đã tìm kiếm một thời gian cho một ví dụ đơn giản tốt, nhưng vẫn còn một số ít các ví dụ ở Scalaz.

Tôi quan tâm đến cả hai giải pháp Scalaz 6 và Scalaz 7.

Trả lời

8

Nếu ống kính bạn đang cố gắng để soạn với ống kính bản đồ là một ống kính một phần, bạn chỉ có thể sử dụng compose:

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

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

Và sau đó:

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 

Lưu ý rằng đây là Scalaz 7.

Nếu ống kính bạn muốn soạn không phải là một phần, bạn có thể làm như vậy với ~:

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) 

Còn có phương pháp .partial nếu bạn không thích toán tử đơn nhất.

+0

Cảm ơn, đây là một câu trả lời tuyệt vời. Tôi cuối cùng đã nhận được thành phần ống kính làm việc với ứng dụng của tôi - rất nhiều cuộc tranh cãi thời gian biên dịch, không có tranh cãi thời gian chạy! –

+0

Tóm lại, mẹo là thêm '.partial' vào ống kính giá trị khi bạn đang xử lý bản đồ. –

Các vấn đề liên quan