2013-07-09 3 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

Это также возможно с экземпляром 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" 

"а" просто [ 'а', 'б', 'C '], поэтому это делает то, что вы хотите.

(Update: Современные lens версии включают этот экземпляр по умолчанию, так что второй фрагмент кода должно работать из коробки.)

+0

Я мог бы поклясться, я попытался это, прежде чем отправлять вопрос и не удалось. Но после проверки снова это работает. Должно быть, что-то испортилось. Во всяком случае, отлично, спасибо! –