寫一個沒有模板 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 功能訪問鏡頭的焦點,然後重建整個型別。