记录镜头

简单记录

{-# LANGUAGE TemplateHaskell #-}
import Control.Lens

data Point = Point {
    _x::Float,
    _y::Float
}
makeLenses ''Point

透镜 xy 被创建。

let p = Point 5.0 6.0 
p ^. x     -- returns 5.0
set x 10 p -- returns Point { _x = 10.0, _y = 6.0 }
p & x +~ 1 -- returns Point { _x = 6.0, _y = 6.0 }

使用重复字段名称管理记录

data Person = Person { _personName::String }
makeFields ''Person

Person 创建一个类型类 HasName,lens name,并使 Person 成为 HasName 的一个实例。后续记录也将添加到该类中:

data Entity = Entity { _entityName::String }
makeFields ''Entity

模板 Haskell 扩展是 makeFields 工作所必需的。从技术上讲,完全可以通过其他方式(例如手工)制作这种镜片。