Lens ライブラリを使用する代替手段。
>import Control.Lens
>import Control.Applicative
>_find :: (a -> Bool) -> Simple Traversal [a] a
>_find _ _ [] = pure []
>_find pred f (a:as) = if pred a
> then (: as) <$> f a
> else (a:) <$> (_find pred f as)
この関数は (a -> Bool) を受け取ります。これは、変更したい型 'a' に対して True を返す関数です。
5 より大きい最初の数を 2 倍にする必要がある場合は、次のように記述できます。
>over (_find (>5)) (*2) [4, 5, 3, 2, 20, 0, 8]
[4,5,3,2,40,0,8]
レンズの素晴らしいところは、合成することで組み合わせることができることです(。)。したがって、2番目のサブリストの最初の数値<100をゼロにしたい場合は、次のことができます。
>over ((element 1).(_find (<100))) (const 0) [[1,2,99],[101,456,50,80,4],[1,2,3,4]]
[[1,2,99],[101,456,0,80,4],[1,2,3,4]]