ほとんどの場合、レコードを作成するたびに、すぐにmakeLenses ''Record
(lens)を追加しています。実際にレコードが与える投影関数を使用することはありません。実際には、makeLenses
が(GHC -ddump-splices
フラグ付きで)何を生成しているかを見ると、生成するレンズの名前を選択する以外は、それらの投影関数を使用していないように見えます。レコード投影関数をレンズに置き換えます。
TemplateHaskell
、またはプリプロセッサ、または他の魔法のような方法がありますが、レコード投影機能を使ってVan Laarhovenレンズをまっすぐにすることはできますか?
data Record a b = Record { x :: a, y :: b }
する(type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
で)生成するであろうことを意味すること、明確にすること
x :: forall a b c. Lens (Record a b) (Record c b) a c
x f (Record _x _y) = fmap (\x' -> Record x' _y) (f _x)
y :: forall a b c. Lens (Record a b) (Record a c) b c
y f (Record _x _y) = fmap (\ y' -> Record _x y') (f _y)
代わりの
x :: forall a b. Record a b -> a
x (Record _x _y) = _x
y :: forall a b. Record a b -> b
y (Record _x _y) = _y
それは定型を取り除くでしょうだけでなく、 makeLenses
でも名前空間を解放することができます(投影func決して定義されません)。
GHCがあり...
https:// hackage.haskell.org/package/record? –