Sử dụng một ống kính thư viện tôi có thể áp dụng một chức năng sửa đổi các mục tiêu cá nhân, như vậy:Kết hợp ống kính
Prelude Control.Lens> (1, 'a', 2) & _1 %~ (*3)
(3,'a',2)
Prelude Control.Lens> (1, 'a', 2) & _3 %~ (*3)
(1,'a',6)
Làm thế nào tôi có thể kết hợp những thấu kính của cá nhân (_1
và _3
) để có thể thực hiện cập nhật này cho cả hai mục tiêu cùng một lúc? Tôi hy vọng điều gì đó trong tinh thần của những điều sau đây:
Prelude Control.Lens> (1, 'a', 2) & ??? %~ (*3)
(3,'a',6)
Tôi không chắc chắn rằng có một sự thực thi hợp lý về một hoạt động như vậy. Giả sử toán tử kết hợp hai ống kính của bạn là '(&&&)'. Nó phải có một cái gì đó kiểu như '(&&&) :: Lens a b -> Lens a b -> Lens a b' để bạn có thể sử dụng nó giống như hai ống kính mà bạn kết hợp để tạo ra nó. Cho rằng 'view _1 (1,2) = 1' và' view _2 (1,2) = 2', bạn mong đợi kết quả của 'view (_1 &&& _2) (1,2)' là gì? –
@ChrisTaylor Tôi không thực sự cần chức năng "getter". Mặc dù AFAIU trong thư viện này thông thường là tiếp cận các trường hợp như vậy với monoid, ví dụ: [Traversal] (http://hackage.haskell.org/packages/archive/lens/latest/doc/html/Control-Lens-Traversal.html). –
Tôi liên kết điều này trong các ý kiến dưới đây, nhưng trong trường hợp ai đó bỏ lỡ nó, có một [vấn đề ống kính] (https://github.com/ekmett/lens/issues/109) về kết hợp các traversals và rắc rối với nó. – shachaf