写一个没有模板 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
功能访问镜头的焦点,然后重建整个类型。