Haskell — объединение результатов из отдельных линз

Я пытаюсь выполнить что-то вроде следующего:

jsonStr = "{\"a\": \"hello\", 
            \"b\": [\"world\", \"everyone\", \"42\"]}"
someALens = ...
someBLens = ...
combinedJson = jsonStr ... someALens ... someBLens

получить в результате:

combinedJson == ["hello world", "hello everyone", "hello 42"]

Тем не менее, комбинированные операторы, которые я нашел (например, <>~), похоже, требуют, чтобы установленное значение отображалось (или иным образом комбинировалось) над объективом. Как мне создать составную линзу, которая может комбинировать значения из нескольких линз?


person Michael Anderson    schedule 09.04.2016    source источник
comment
Я думаю, stackoverflow.com/questions/17552835/ это то, что вы ищете. Как только вы определите экземпляр Monoid, как описано выше, вы сможете написать combinedJson = jsonStr ^.. (someALens <> someBLens).   -  person hao    schedule 09.04.2016
comment
@haoformayor этот экземпляр моноида включен в более поздние lens выпуски. Просто сделайте ^.. (someALens <> someBLens) ответ.   -  person leftaroundabout    schedule 09.04.2016
comment
Это было то, что мне было нужно. Спасибо! Как только кто-то поставит это как ответ, я отмечу это как правильное.   -  person Michael Anderson    schedule 09.04.2016


Ответы (1)


Как обсуждалось в комментариях, ответ довольно антиклиматический jsonStr ^.. (someALens <> someBLens). Два геттера отображаются в складку. Моноиды, наши друзья навсегда.

person hao    schedule 09.04.2016
comment
Как это разочаровывает? Я бы сказал, что это довольно красиво в своей простоте! - person leftaroundabout; 09.04.2016
comment
Согласен - это одна из причин, по которой я продолжаю возвращаться к Haskell. - person Michael Anderson; 12.04.2016