Ai đó có thể giải thích các ống kính chức năng cho tôi? Đó là một chủ đề khó khăn đáng ngạc nhiên đối với google và tôi đã không thực hiện bất kỳ tiến bộ nào. Tất cả những gì tôi biết là chúng cung cấp chức năng get/set tương tự như trong OO.Ống kính chức năng
74
A
Trả lời
56
Một ống kính bao gồm hai chức năng, một getter và setter:
data Lens a b = Lens { getter :: a -> b, setter :: b -> a -> a }
Ví dụ, chúng ta có thể có ống kính cho các bộ phận đầu tiên và thứ hai của một cặp:
fstLens :: Lens (a, b) a
fstLens = Lens fst $ \x (a, b) -> (x, b)
sndLens :: Lens (a, b) b
sndLens = Lens snd $ \x (a, b) -> (a, x)
Các thực sự tiện lợi của ống kính là chúng sáng tác:
compose :: Lens b c -> Lens a b -> Lens a c
compose f g = Lens (getter f . getter g) $
\c a -> setter g (setter f c (getter g a)) a
Và chúng chuyển đổi thành State
chuyển tiếp:
lensGet :: MonadState s m => Lens s a -> m a
lensGet = gets . getter
lensSet :: MonadState s m => Lens s b -> b -> m()
lensSet f = modify . setter f
lensMod :: MonadState s m => Lens s b -> (b -> b) -> m()
lensMod f g = modify $ setter f =<< g . getter f
(+=) :: (MonadState s m, Num b) => Lens s b -> b -> m()
f += x = lensMod f (+ x)
12
Xem câu trả lời cho câu hỏi lenses, fclabels, data-accessor - which library for structure access and mutation is better - nó có giải thích rõ ràng về thấu kính.
Ngoài ra, tài liệu cho thư viện Data.Lenses và fclabel cung cấp một số ví dụ điển hình về chúng đang được sử dụng.
Các vấn đề liên quan
- 1. Ống kính đẳng cấu
- 2. Kết hợp ống kính
- 3. đây có phải là điểm dành cho ống kính chức năng trong javascript không?
- 4. R Chức năng đường ống
- 5. Construct predicates với ống kính
- 6. Scalaz: cách tạo ống kính bản đồ với ống kính giá trị?
- 7. cây ngang với Ống kính và Dây khóa kéo
- 8. Ống kính Windows Phone 8 tăng cường thực tế
- 9. Bắt nhiều kết quả từ bản đồ với "ống kính"
- 10. Ống kính được sử dụng/hữu ích cho là gì?
- 11. Tạo ống kính cho thư viện "ống kính" với bộ xử lý tên tùy chỉnh thay vì mặc định "gạch dưới" dựa trên một
- 12. chức năng threadscope
- 13. dữ liệu đường ống thông qua chức năng tùy ý trong Clojure
- 14. Xử lý đường ống và tham số đầu vào trong chức năng Powershell
- 15. Chức năng trong một TSQL Chức năng
- 16. Có thể xây dựng một kỷ lục mới bằng cách sử dụng Ống kính không?
- 17. Ứng dụng thực tế của "Chuối, ống kính, phong bì và dây thép gai"?
- 18. Tôi làm cách nào để tạo các ống kính từ một bản ghi trong GHCi
- 19. Làm thế nào để tạo hiệu ứng ống kính mắt cá của OpenGL?
- 20. Chèn vào danh sách tại một vị trí cụ thể bằng cách sử dụng ống kính
- 21. Cập nhật nhiều trường con của trường bằng cách sử dụng Ống kính ekmett
- 22. FindChessboardCorners không thể phát hiện bàn cờ trên hình ảnh rất lớn bằng ống kính tiêu cự dài
- 23. Sẽ có sự khác biệt về hiệu suất giữa các chức năng ẩn danh và các chức năng bình thường?
- 24. chức năng ảo const vs chức năng ảo không const
- 25. Python vá giả một chức năng trong một chức năng
- 26. Chức năng gọn gàng với chức năng Google Maps FitBounds()
- 27. Delphi 2010 Chức năng rộng so với chức năng chuỗi
- 28. Gọi chức năng ghi đè từ chức năng ghi đè
- 29. khai C chức năng trong một chức năng
- 30. chức năng inline vs chức năng vĩ mô
Có [giới thiệu tốt về ống kính] (http://www.youtube.com/watch?v=efv0SQNde5Q) bởi Edward Kmett trên YouTube. Các ví dụ ở Scala, nhưng nó không quá khó để làm theo. – hammar
Yup, cố xem những thứ đó, nhưng có đủ thời gian trong khi tôi vẫn tỉnh táo, không dễ như vậy: P – Masse
@Jochen: Các thấu kính được mô tả không thực sự có nhiều điểm chung với các ống kính mà câu hỏi này nói đến. – sclv