本着以下问题的精神:
我现在正在寻找一种方法将多个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 `<>'
那么我该如何实现呢?这有可能吗?
答案 0 :(得分:4)
使用此答案中发布的Monoid实例也可以这样做: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”只是['a','b','c'],所以这就是你想要的。
(更新:现代lens
版本默认包含此实例,因此第二个代码段应该可以直接使用。)