import Control.Lens Control.Lens> import qualified Data.Map as Map 以及定义如下的 map 值: Control.-6ren">
gpt4 book ai didi

haskell - 从 "lens"的 map 获取多个结果

转载 作者:行者123 更新时间:2023-12-02 09:33:58 24 4
gpt4 key购买 nike

拥有这些导入:

> import Control.Lens
Control.Lens> import qualified Data.Map as Map

以及定义如下的 map 值:

Control.Lens Map> let m = Map.fromList [('a', 1), ('c', 3), ('b', 2)]

我可以像这样一一获取它的元素:

Control.Lens Map> view (at 'b') m
Just 2

我想知道的是,有一组像这样的键:

Control.Lens Map> import qualified Data.Set as Set
Control.Lens Map Set> let keys = Set.fromList ['d', 'c', 'b']

如何构造这样的 getter(我猜),使用它我将能够获得匹配元素的集合(或列表):

Control.Lens Map Set> view (**???**) m
[3, 2]

请注意,结果仅包含 2 个元素,因为没有匹配键 'd'

最佳答案

如果您只想在多个字段上使用 getter,则以下内容将起作用。

首先,您需要使lens中的Accessor成为Monoid的实例(该实例位于HEAD中,但尚未发布 已在lens >= 4中定义,因此如果您使用的是旧版本的库,则只需定义实例)。

import Data.Monoid
import Control.Lens

instance Monoid r => Monoid (Accessor r a) where
mempty = Accessor mempty
mappend (Accessor a) (Accessor b) = Accessor $ a <> b

然后,您可以使用该实例将多个镜头/遍历合并为单个遍历:

>>> import qualified Data.Set as S
>>> import qualified Data.Map as M
>>> import Data.Foldable (foldMap)
>>> import Control.Lens
>>> let m = M.fromList [('a',1), ('b',2), ('c',3)]
>>> let k = S.fromList ['b','c','e']
>>> m ^.. foldMap at k
[Just 2,Just 3,Nothing]
>>> m ^.. foldMap ix k
[2,3]

foldMap 使用 Monoid 实例作为访问器,使用 Monoid 实例作为函数。

关于haskell - 从 "lens"的 map 获取多个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17144334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com