如何使用镜头在Aeson.Object中的所有键/值对上进行concatMap

时间:2018-09-28 10:35:42

标签: haskell lens aeson

我一直在愚弄Control.Lens.Indexed中的组合器,尤其是iconcatMap,但是我无法使用{{ 3}}镜头:

func 

  -- list of key/value pairs, essentially
  :: Aeson.Object                  

  -- function for the concatMap operation to which the 
  -- key (Text) and value is passed
  -> (Text -> Aeson.Value -> [a])  

  -- resultant concatenated list
  -> [a]

1 个答案:

答案 0 :(得分:3)

所需功能为iconcatMapOf。另外,请注意,membersAsValue实例遍历类型,Object没有这样的实例,因此我们需要将其包装到Value中。

import qualified Data.Aeson as Aeson
import Control.Lens
import Data.Aeson.Lens
import Data.Text

func :: Aeson.Object -> (Text -> Aeson.Value -> [a]) -> [a]
func obj f = iconcatMapOf members f (Aeson.Object obj)