写一个没有模板 Haskell 的镜头

为了揭开模板 Haskell 的神秘面纱,假设你有

data Example a = Example { _foo::Int, _bar::a }

然后

makeLenses 'Example

产生(或多或少)

foo::Lens' (Example a) Int
bar::Lens (Example a) (Example b) a b

但是,没有什么特别神奇的事情发生。你可以自己写这些:

foo::Lens' (Example a) Int
--  :: Functor f => (Int -> f Int) -> (Example a -> f (Example a))    ;; expand the alias
foo wrap (Example foo bar) = fmap (
ewFoo -> Example newFoo bar) (wrap foo)

bar::Lens (Example a) (Example b) a b
--  :: Functor f => (a -> f b) -> (Example a -> f (Example b))    ;; expand the alias
bar wrap (Example foo bar) = fmap (
ewBar -> Example foo newBar) (wrap bar)

基本上,你希望使用 wrap 功能访问镜头的焦点,然后重建整个类型。