2016-04-09 5 views
1

Я пытаюсь сделать что-то вроде следующего:Haskell - Объединение результатов из отдельных линз

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

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

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

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

+1

Я думаю http://stackoverflow.com/questions/17552835/combining-getters-into-a-fold - это то, что вы ищете. Как только вы определите экземпляр Monoid, как описано выше, вы сможете написать 'объединенныйJson = jsonStr^.. (someALens <> someBLens)'. – hao

+2

@haoformayor, что экземпляр monoid _included_ в более поздних выпусках 'lens'. Просто сделайте '^ .. (someALens <> someBLens)' ответ. – leftaroundabout

+0

Это то, что мне нужно. Благодаря! Как только кто-то ответит, я сделаю это правильно. –

ответ

4

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

+1

Как это разочарование? Я бы сказал, что он довольно красив в своей простоте! – leftaroundabout

+0

Согласен - это одна из причин, по которой я возвращаюсь в Хаскелл. –

 Смежные вопросы

  • Нет связанных вопросов^_^