次のような配列があるとします。[1, 2, 3, 4]
lens パッケージを使用して偶数値のみを変更するにはどうすればよいですか? 私は次のようなものを探しています:
filterLens even (+10) $ [1, 2, 3, 4]
=> [1, 12, 3, 14]
次のような配列があるとします。[1, 2, 3, 4]
lens パッケージを使用して偶数値のみを変更するにはどうすればよいですか? 私は次のようなものを探しています:
filterLens even (+10) $ [1, 2, 3, 4]
=> [1, 12, 3, 14]
Prelude Control.Lens> [1, 2, 3, 4] & each . filtered even %~ (+ 10)
[1, 12, 3, 14]
このような関数を見つけるには、検索フィールドに「+lens」を入力してレンズ パッケージを検索するように hoogle に指示できます。この場合: http://www.haskell.org/hoogle/?hoogle=%2Blens+filter
さて、私たちが望むタイプを見ると
evens :: Lens' [a] [a]
フォーカスされたリストの長さで揺れない限り、有効なレンズであるように思われます。したがって、ゲッターと解決済みのペアを使用して構築するのは比較的簡単です。
evens = lens get set where
get (a:b:xs) = b : get xs
get _ = []
set [] xs = xs
set xs [] = xs
set (x:xs) (y:ys) = x:y:set xs ys
しかし、set 関数に細心の注意を払うと、完全な filterLens を実装するのが難しいことがわかります。レンズのターゲットの正確な構造を知っているという事実を悪用します。汎用の filterLens は、そのピースのみを使用して型全体を再構築するために、順序を再構築できる必要があります。一般的な型と述語の場合、これは不可能か、少なくとも自動化が困難です。