2016-10-12 17 views
5

Tôi cần một chức năng như <<%~ mà sẽ hành động với Traversal s trong thời trang tương tự như ^?, như thế này:Analog của `<<% ~` không đòi hỏi monoid cho Traversal

(<<?%~) :: Traversal s t a b -> (a -> b) -> s -> (Maybe a, t) 

> ix 0 <<?%~ succ $ [1,2] 
(Just 1,[2,2]) 
> ix 1 <<?%~ succ $ [1,2] 
(Just 2,[1,3]) 
> ix 2 <<?%~ succ $ [1,2] 
(Nothing,[1,2]) 

Làm thế nào tôi nên thực hiện nó? Cách rõ ràng là áp dụng riêng biệt ^?%~, nhưng tôi muốn một giải pháp trong một lần.

Trả lời

4

Nếu chúng tôi không muốn yêu cầu ràng buộc Monoid đối với các mục tiêu, chúng tôi phải chỉ định chính mình là Monoid sẽ được sử dụng để kết hợp các yếu tố cũ trong quá trình truyền tải. Vì mục tiêu là một cái gì đó tương tự như ^?, monoid thích hợp là First.

(<<?%~) :: LensLike ((,) (First a)) s t a b -> (a -> b) -> s -> (Maybe a, t) 
l <<?%~ f = first getFirst . (l $ \a -> (First (Just a), f a)) 
+3

Tôi đã thay đổi khung xung quanh giải pháp của bạn khá mạnh. Vui lòng hoàn nguyên các thay đổi nếu bạn không thích chúng. – duplode

+0

@duplode cảm ơn. Buồn tôi không thể upvote câu trả lời :) – modular

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