2016-04-09 36 views
1

sonuçlar birleştirilerek aşağıdaki:Haskell - Ben böyle bir şey başarmak için çalışıyorum ayrı lensler

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

Ancak, kombinasyon operatörleri ben oldum:

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

sonucu almak için (<>~ gibi) bir objektif üzerinde mappend (veya başka bir şekilde birleştirmek) için bir ayar değeri gerektiriyor gibi görünüyor. Birden çok mercekten gelen değerleri birleştirebilen bileşik bir lensi nasıl oluşturabilirim?

+1

Sanırım http://stackoverflow.com/questions/17552835/combining-getters-into-a-fold aradığınız şeydir. Monoid örneğini yonder üzerinde açıklandığı şekilde tanımladığınızda, "kombineJson = jsonStr^.. (someALens <> someBLens)" yazabilirsiniz. – hao

+2

@haoformayor, örneğin, daha yeni olan “lens” sürümlerinde _included_. Sadece '^ .. (bazılarında <> someBLens) bir cevap verin. – leftaroundabout

+0

İhtiyacım olan buydu. Teşekkürler! Birisi bir cevap olarak koyduğunda, doğru olarak işaretlerim. –

cevap

4

Görüşlerde tartışıldığı gibi, cevap oldukça anticlimactic jsonStr ^.. (someALens <> someBLens)'dur. İki alıcı bir katla eşleştirilir. Monoidler, sonsuza kadar arkadaşlarımız.

+1

Bu anticlimactic nasıldır? Sadeliği içinde oldukça güzel olduğunu söyleyebilirim! – leftaroundabout

+0

Anlaştık - Haskell'e geri dönmemin sebeplerinden biri bu. –