8

Control.Lens パッケージに感謝しています。少し脆弱な Haskell レコード構文で本当に役立ちます。パフォーマンスが懸念されるライブラリの一部に取り組んでいます。関数での基本的なパターンマッチングと比較して、以下に示すように型クラスを介して公開された単純なレンズを使用した場合のパフォーマンスのペナルティがあれば、それがどのようなものになるか知っている人はいますか? このようにレンズを使用すると、レコードの名前空間の競合の問題をうまく回避できる可能性があります。自分でいくつかのベンチマークを設定することはできますが、誰かが私の問題を解決してくれるかどうか知りたいです。ありがとう。

レンズ クラス

class LensX v where
  _x :: Functor f => (Double -> f Double) -> v -> f v

class LensY v where
  _y :: Functor f => (Double -> f Double) -> v -> f v

class LensZ v where
  _z :: Functor f => (Double -> f Double) -> v -> f v 

レンズ インスタンス

instance LensX Vec3 where
  _x f (Vec3 x y z) = fmap (\x' -> Vec3 x' y z) (f x)

instance LensY Vec3 where
  _y f (Vec3 x y z) = fmap (\y' -> Vec3 x y' z) (f y)

instance LensZ Vec3 where
  _z f (Vec3 x y z) = fmap (\z' -> Vec3 x y z') (f z)

Lenses を提供するモジュールは Control.Lens パッケージをインポートする必要がありません。これは素晴らしいことです。ライブラリの使用については、このページhttps://github.com/ekmett/lens/で説明されています。

4

1 に答える 1

8

このタイプのレンズでは、わずかなパフォーマンス ペナルティが発生します。これは、ディクショナリの受け渡しを発生させる制約を持つ上位のすべての型に由来します。

これは、 data-lensに戻りたい場合のまれなケースの 1 つであり、その問題はなく、コードを高速化することさえできます。comonad indirectionをデコードする場合、data-lens は、レンズにStore使用できる最も簡単な表現を使用します。

newtype Lens s a = Lens (s -> (a, a -> s))

ライブラリはそれ自体ではポリモーフィック レンズをサポートしていませんが、独自のレンズ タイプを構築して、高いパフォーマンスを実現できます。

newtype Lens s t a b = Lens (s -> (a, b -> t))

特定の目的のために、線形パッケージにも興味があるかもしれません。

于 2013-02-13T07:58:43.443 に答える