4

Edward Kmett のマインド拡張レンズと lens-aeson パッケージを試してみます。ウォーミングアップはこちら

s = "{ \"somekey\" : [ { \"deeperkey\" : 1} , {\"deeperkey\": 2, \"otherkey\":3}]}

望ましい結果は

[(1, Nothing), (2, Just 3)]

私は少し進歩することができます

import Control.Lens.Aeson
import Control.Lens
import Control.Monad
import qualified Data.Vector as V

λ> s ^. key "somekey" . _Array . to V.toList >>= (^.. key "deeperkey" . _Number)
[1,2]

しかし、私はこれまでのところ、正しい答えを得るためにコンビネータを十分に機能させる方法を理解していません。私はおそらくフラグメント ' key "otherkey" ' を含みます。何か案は?

4

1 に答える 1

3

これを試して

s ^.. key "somekey" . _Array . traverse 
                    . to (\o -> ( o ^?! key "deeperkey" . _Number
                                , o ^?  key "otherkey"  . _Number
                                )
                         )

(^..)から複数の要素を取得し、スロット内の複数の値traverse TraversalArray照合します。"somekey"技術的には、key "deeperkey"失敗を許容する必要がありますが、戻り値の型に基づいて、そうではないという強い仮定を作成しているため、保護のためにモナドなしで(^?!)失敗を行うために使用します。(^?)Maybe

于 2013-10-21T00:58:17.503 に答える