2013-07-09 51 views
1

在以下几个问题精神:结合吸气剂做成了折叠

我现在正在寻找一种方式将多个Getters合并成一个Fold,所以如下所示:

('a','b','c','d') ^.. (_1 <> _2 <> _3) 

会导致这样的:

['a', 'b', 'c'] 

但实际上面的代码失败,出现以下消息:

No instance for (Monoid 
        (Accessor (Endo [Char]) (Char, Char, Char, Char))) 
    arising from a use of `<>' 

那么,如何实现这一目标?这可能吗?

回答

4

这也可能与含半幺群实例张贴在这样的回答:Getting multiple results from map with lens

import Data.Monoid 
import Control.Lens 

instance Monoid r => Monoid (Accessor r a) where 
    mempty = Accessor mempty 
    mappend (Accessor a) (Accessor b) = Accessor $ a <> b 

测试:

*Control.Lens Data.Monoid> ('a','b','c','d') ^.. (_1 <> _2 <> _3) 
"abc" 

“ABC” 只是[ '一', 'B','C '],所以这就是你想要的。

(更新:现代lens版本包括这种情况下默认,所以第二代码片段应该只是工作开箱。)

+0

我可以发誓,我发布这个问题之前尝试这样做,它失败了。但现在再次检查后,它可以工作。一定弄糟了。无论如何,太棒了,谢谢! –