Haskell 如何使用镜头修改与条件匹配的元素?

Haskell 如何使用镜头修改与条件匹配的元素?,haskell,haskell-lens,Haskell,Haskell Lens,我正试图使用镜头编写一个具有以下类型签名的函数,但茫然地盯着它看显然不起作用 modifyElem :: (a -> Bool) -- predicate function -> (a -> a) -- modification to apply -> [a] -> [a] 如果可能,这也可以进一步概括为以下内容: modifyElem :: (Foldable t) -- or (Traversable t)

我正试图使用镜头编写一个具有以下类型签名的函数,但茫然地盯着它看显然不起作用

modifyElem
  :: (a -> Bool)      -- predicate function
  -> (a -> a)         -- modification to apply
  -> [a]
  -> [a]
如果可能,这也可以进一步概括为以下内容:

modifyElem
  :: (Foldable t)     -- or (Traversable t)
  -> (a -> Bool)
  -> (a -> a)
  -> t a
  -> t a
试试这个:

modifyElem :: Traversable t => (a -> Bool) -> (a -> a) -> t a -> t a
modifyElem predicate transform target =
  target & traverse . filtered predicate %~ transform
试试这个:

modifyElem :: Traversable t => (a -> Bool) -> (a -> a) -> t a -> t a
modifyElem predicate transform target =
  target & traverse . filtered predicate %~ transform