2

本着以下问题的精神:

我现在正在寻找一种将多个Getter组合成一个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

1 回答 1

5

这也可以通过此答案中发布的 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版本默认包含此实例,因此第二个代码片段应该开箱即用。)

于 2013-07-09T16:03:20.263 回答