2016-10-12 38 views
5

我需要一個像<<%~一個函數,會以類似的方式與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]) 

我應該如何實現呢?顯而易見的方法是分別申請^?%~,但我想要一個解決方案。

回答

4

如果我們不想要求在目標上有一個Monoid約束,我們必須指定我們自己Monoid,它將用於在遍歷中組合舊元素。由於目標與^?類似,所以適當的monoid爲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

我改變了你的解決方案的框架,相當激烈。如果您不喜歡它們,請隨時恢復更改。 – duplode

+0

@duplode謝謝。傷心我不能upvote答案:) – modular