此组合器是否已存在于lens
或其他库中的某个位置?
filteredHas :: Lens.Fold s i -> Lens.IndexedTraversal' i s s
filteredHas fold f val =
case val ^? fold of
Nothing -> pure val
Just proof -> Lens.indexed f proof val
对于只有在具有某个子值时才希望修改值的情况,它才有用。
即它可以替换像
这样的代码Lens.filtered (Lens.has part) %~ \x -> something (x ^?! part) x
filteredHas part %@~ something
。