将柯里化函数应用于索引遍历的优雅方式

问题描述 投票:0回答:1

我想写一个咖喱函数

f :: i -> a -> b

使用索引遍历

l :: IndexedTraversal' i s a

将其应用于

s
并返回
[b]

我想到了

s ^.. l . withIndex . to (uncurry f)

但是我想要一个组合器

itoListByOf
,它可以让我这样做

s & itoListByOf l f

itoListByOf :: IndexedGetting i (Endo [b]) s a -> (i-> a -> b) -> s -> [b]
itoListByOf l f = ifoldrOf l (\i a -> (f i a :)) []

但我想确保我没有错过这个隐藏在库中的更通用类型的组合器。

haskell haskell-lens
1个回答
0
投票

看起来您已经正确定义了 itoListByOf 函数来实现您的目标。虽然镜头库中有许多提供类似功能的组合器,但我认为没有更通用的组合器与您正在寻找的类型完全相同。

您在 itoListByOf 的定义中使用的 ifoldrOf 函数本身是一个非常通用的函数,可用于遍历任何 IndexedFold 并累积结果。 itoListByOf 函数只是专门针对 ifoldrOf 的情况,其中累积函数是将 f 函数应用于折叠的每个元素并将结果附加到列表的函数。

综上所述,我相信您的 itoListByOf 实现是一个很好的实现,并且在镜头库中没有更通用的相同类型的组合器。

© www.soinside.com 2019 - 2024. All rights reserved.