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

This is also possible with the Monoid instance posted in this answer: 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

Test:

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

"abc" is just ['a','b','c'], so this does what you want.

(Update: Modern lens versions include this instance by default, so the second code snippet should just work out of the box.)

于 2013-07-09T16:03:20.263 に答える