2016-04-09 12 views
1

Ich versuche, so etwas wie das zu erreichen, folgende:Haskell - Kombinieren Sie Ergebnisse aus einzelnen Linsen

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

als Ergebnis zu erhalten:

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

Allerdings habe ich die Kombination Betreiber gewesen bin Das Finden (wie <>~) scheint einen gesetzten Wert zu erfordern, um über eine Linse zu mappen (oder anderweitig zu kombinieren). Wie könnte ich eine zusammengesetzte Linse erstellen, die Werte von mehreren Linsen kombinieren kann?

+1

Ich denke, http://stackoverflow.com/questions/17552835/combining-getters-into-a-fold ist was du suchst. Sobald Sie die Monoid-Instanz wie oben beschrieben definiert haben, können Sie 'combinedJson = jsonStr^.. (someALens <> someBLLens)' schreiben. – hao

+2

@haoformayoder diese Monoid-Instanz ist in neueren 'Linsen'-Versionen enthalten. Machen Sie einfach '^ .. (someALens <> someBLLens)' eine Antwort. – leftaroundabout

+0

Das war was ich brauchte. Vielen Dank! Sobald jemand es als Antwort ausgibt, werde ich es als korrekt markieren. –

Antwort

4

Wie in den Kommentaren diskutiert, ist die Antwort die eher antiklimaktische jsonStr ^.. (someALens <> someBLens). Zwei Getter mappen in eine Falte. Monoids, unsere Freunde für immer.

+1

Wie ist das antiklimaktisch? Ich würde sagen, es ist ziemlich schön in seiner Einfachheit! – leftaroundabout

+0

Einverstanden - das ist einer der Gründe, warum ich immer wieder zu Haskell komme. –