我有一个非记录newtype,我想为它生成镜头:
newtype
newtype Foo = Foo (Int, String)
我想做一个命名的镜头,目前我正在做手动如下:
bar :: Lans' Foo Int bar = lens (\(Foo (x, y)) -> x) (\(Foo (x,y)) x' -> Foo (x', y))
我更喜欢在这里使用一些TH魔术或至少更复杂的语法,如:
bar :: Lens' Foo Int bar = Foo <$> _1
有可能吗?
83qze16e1#
你可能需要Control.Lens.Wrapped来处理新类型,你可以通过泛型构造一个Wrapped示例:
Control.Lens.Wrapped
Wrapped
newtype Foo = Foo (Int, String) deriving (Generic) instance Wrapped Foo
然后可以写:
bar :: Lens' Foo Int bar = _Wrapped' . _1
1条答案
按热度按时间83qze16e1#
你可能需要
Control.Lens.Wrapped
来处理新类型,你可以通过泛型构造一个Wrapped
示例:然后可以写: