记录镜头
简单记录
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data Point = Point {
_x::Float,
_y::Float
}
makeLenses ''Point
透镜 x
和 y
被创建。
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
工作所必需的。从技术上讲,完全可以通过其他方式(例如手工)制作这种镜片。