2

次のような配列があるとします。[1, 2, 3, 4]

lens パッケージを使用して偶数値のみを変更するにはどうすればよいですか? 私は次のようなものを探しています:

filterLens even (+10) $ [1, 2, 3, 4]
=> [1, 12, 3, 14]
4

2 に答える 2

7
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

于 2014-06-07T01:29:26.990 に答える
1

さて、私たちが望むタイプを見ると

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 は、そのピースのみを使用して型全体を再構築するために、順序を再構築できる必要があります。一般的な型と述語の場合、これは不可能か、少なくとも自動化が困難です。

于 2014-06-06T23:59:51.063 に答える