haskell 写入或生成非记录数据类型的镜头

j0pj023g  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(138)

我有一个非记录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

有可能吗?

83qze16e

83qze16e1#

你可能需要Control.Lens.Wrapped来处理新类型,你可以通过泛型构造一个Wrapped示例:

newtype Foo = Foo (Int, String) deriving (Generic)
instance Wrapped Foo

然后可以写:

bar :: Lens' Foo Int
bar = _Wrapped' . _1

相关问题