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