haskell 用哪种透镜可以得到一个艾逊物体的所有钥匙?

83qze16e  于 2023-02-13  发布在  其他
关注(0)|答案(3)|浏览(144)

我正在寻找https://www.stackage.org/haddock/lts-12.1/lens-aeson-1.0.2/Data-Aeson-Lens.html,并试图找到一个透镜,它可以给予我所有的键从一个Object.概念上,我正在寻找以下:

allKeys :: Value -> Maybe [Text]
allKeys v = v ^? _Object . keys -- `keys` is not an actual lens!

我能 * 可能 * 达到的最接近的方法是使用members,但它似乎不是实现这一点的最容易/最快/最短的方法。

toe95027

toe950271#

我可能会用@Gurkenglas建议的,或者

view (_Object . to HM.keys)
    :: (AsValue s, MonadReader s m)
    => m [Text]

我发现需要注意的是lens在这里并不怎么出色;这是有原因的。对象的键是其“形状”的一部分。lens在你不需要改变形状的时候工作得很好。所以你可以 * 获取 * 键,但是你不能做其他的事情,也就是说,你不能 * 设置 * 或者 * 修改 * 它们。

lyr7nygr

lyr7nygr2#

toKeysList :: Value -> [Text]
toKeysList = toListOf $ members . asIndex
2ul0zpep

2ul0zpep3#

为了补充@Gurkenglas的答案,需要在toKeysList中做一个小的更新,因为members函数的类型签名在lens-aeson-1.2中从AsValue t => IndexedTraversal' Text t Value更改为AsValue t => IndexedTraversal' Key t Value

toKeysList :: Value -> [Text]
toKeysList = toListOf $ members . asIndex . from _Key

相关问题