为了揭开 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 (\newFoo -> 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 (\newBar -> Example foo newBar) (wrap bar)
本质上,您想使用该wrap功能“访问”镜头的“焦点”,然后重建“整个”类型。