我很欣赏 Control.Lens 包。它确实有助于稍微弱一点的 Haskell 记录语法。我正在研究库的某些部分,其中性能是一个问题。有谁知道与函数中的基本模式匹配相比,使用通过如下所示的类型类公开的简单镜头会产生什么性能损失(如果有的话)?像这样使用 Lenses 有可能很好地解决记录命名空间冲突问题。我可以自己设置一些基准,但很好奇是否有人可以为我省去麻烦。谢谢。
镜头类
class LensX v where
_x :: Functor f => (Double -> f Double) -> v -> f v
class LensY v where
_y :: Functor f => (Double -> f Double) -> v -> f v
class LensZ v where
_z :: Functor f => (Double -> f Double) -> v -> f v
镜头实例
instance LensX Vec3 where
_x f (Vec3 x y z) = fmap (\x' -> Vec3 x' y z) (f x)
instance LensY Vec3 where
_y f (Vec3 x y z) = fmap (\y' -> Vec3 x y' z) (f y)
instance LensZ Vec3 where
_z f (Vec3 x y z) = fmap (\z' -> Vec3 x y z') (f z)
提供 Lenses 的模块不必导入 Control.Lens 包,非常棒。此页面https://github.com/ekmett/lens/描述了该库的使用。